React 기초 문법 가이드

React는 컴포넌트 기반 UI 라이브러리로, 효율적으로 사용자 인터페이스를 구성하기 위해 사용되며. JSX 문법과 컴포넌트 개념이 핵심

1. JSX 문법

React는 JavaScript와 HTML을 결합한 JSX (JavaScript XML) 문법을 사용

function App() { 
return <h1>Hello, React!</h1>; 
}

JSX 특징

  • HTML과 유사하지만 JavaScript 코드로 변환가능
  • 중괄호 {}로 JavaScript 표현식을 사용가능
const name = 'Nell'; 
const age = 25; 
function App() { 
return <h1>{name}는 {age}살입니다.</h1>;
}

2. 컴포넌트 (Components)

(1) 함수형 컴포넌트

function Greeting() { 
return <h2>안녕하세요!</h2>;
} export default Greeting;

(2) 클래스형 컴포넌트

import React, { Component } from 'react'; 
class Greeting extends Component { 
render() { return <h2>안녕하세요!</h2>; }
} export default Greeting;
3. Props (Properties)

부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달합니다.

function Greeting(props) { 
return <h1>안녕하세요,
{props.name}님!</h1>;
} function App() { 
return <Greeting name="Nell" />;
}

4. State (상태)

컴포넌트 내부에서 상태를 관리합니다.

import React, { useState } from 'react'; 
function Counter() { 
const [count, setCount] = useState(0); 
return ( 
<div> <p>카운트: {count}</p> <button onClick={() => setCount(count + 1)}>증가</button>
</div> ); } 
export default Counter;

5. 이벤트 핸들링

React에서 이벤트는 camelCase로 작성합니다.

function Button() { 
function handleClick() {
alert('버튼이 클릭되었습니다!');
} return 
<button onClick={handleClick}>클릭</button>; 
}

6. 조건부 렌더링

function Message({ isLoggedIn }) {
return ( 
<div> {isLoggedIn ? 
<h1>환영합니다!</h1> : <h1>로그인 해주세요.</h1>
} </div>
);
}

7. 리스트 렌더링

function ItemList() { 
const items = ['React', 'Vue', 'Angular']; 
return ( <ul> {items.map((item, index) => ( <li key={index}>{item}</li> ))} </ul> ); }

8. 스타일 적용

function StyledText() { 
const textStyle = { color: 'blue', fontSize: '20px' }; 
return <p style={textStyle}>스타일이 적용된 텍스트</p>;
}

9. useEffect (컴포넌트 생명주기)

import React, { useState, useEffect } from 'react'; 
function Timer() { 
const [count, setCount] = useState(0); 
useEffect(() => { document.title = `카운트: ${count}`; }, [count]); 
return <button onClick={() => setCount(count + 1)}>증가</button>; } 
export default Timer;

요약

  • JSX: JavaScript + HTML 문법
  • 컴포넌트: UI 재사용 단위 (함수형 권장)
  • Props와 State: 데이터 관리
  • 이벤트 핸들링, 조건부/리스트 렌더링 지원
  • useEffect: 컴포넌트 생명주기 제어

'Front-End > React' 카테고리의 다른 글

Router  (0) 2025.02.17
React-ContextAPI  (0) 2025.02.17
ReportWebVitals란?  (0) 2025.02.11

ReportWebVitals?

**reportWebVitals**는 React 프로젝트에서 웹 성능 데이터를 수집하는 함수입니다.
React 공식 템플릿 (Create React App)으로 프로젝트를 생성하면 기본적으로 포함되어 있다,

이 함수는 Web Vitals 메트릭(웹 성능 지표)을 기록하거나 분석 도구로 전송하는 데 사용됩니다.

Web Vitals 메트릭

메트릭설명

FCP First Contentful Paint - 첫 번째 콘텐츠가 렌더링되는 시간
LCP Largest Contentful Paint - 가장 큰 콘텐츠가 렌더링되는 시간
CLS Cumulative Layout Shift - 레이아웃 불안정성
FID First Input Delay - 첫 사용자 입력에 대한 응답 시간
TTFB Time to First Byte - 첫 바이트가 수신되는 시간

사용 방법

src/reportWebVitals.js

const reportWebVitals = (onPerfEntry) => {
  if (onPerfEntry && onPerfEntry instanceof Function) {
    import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
      getCLS(onPerfEntry);
      getFID(onPerfEntry);
      getFCP(onPerfEntry);
      getLCP(onPerfEntry);
      getTTFB(onPerfEntry);
    });
  }
};
export default reportWebVitals;

프로젝트에 연결하기

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    {" "}
    <App />{" "}
  </React.StrictMode>
); // 콘솔에 성능 데이터를 출력 reportWebVitals(console.log);

분석 도구로 데이터 전송

예를 들어, Google Analytics에 성능 데이터를 전송할 수 있습니다.

import reportWebVitals from "./reportWebVitals";
reportWebVitals((metric) => {
  const body = JSON.stringify(metric);
  navigator.sendBeacon("/analytics", body);
});

'Front-End > React' 카테고리의 다른 글

Router  (0) 2025.02.17
React-ContextAPI  (0) 2025.02.17
React-기본  (0) 2025.02.11

Webpack이란?

Webpack은 JavaScript 애플리케이션을 위한 **모듈 번들러(Module Bundler)**이다.

여러 개의 자바스크립트 파일, CSS, 이미지 등을 하나의 파일(혹은 효율적인 여러 파일)로 묶어 배포할 수 있도록 최적할수있는 도구

Webpack이 필요한이유??

문제 상황

  • 프로젝트가 커질수록 많은 자바스크립트 파일과 CSS 파일이 생김
  • 브라우저가 모든 파일을 개별적으로 가져오면 속도가 느려지고 관리가 어려워짐
  • 최신 JavaScript 문법은 일부 브라우저에서 지원되지 않을 수 있기때문이다.

해결 방법

  • 모듈 번들링: 여러 파일을 하나로 묶어 네트워크 요청을 최소화
  • 코드 압축(uglify): 파일 크기를 줄여 로딩 속도 개선
  • 트랜스파일링(Babel): 최신 문법을 구형 브라우저에서도 사용 가능하도록 변환

Webpack의 주요 개념

개념설명

Entry 애플리케이션의 시작점(기본값: src/index.js)
Output 번들링된 파일의 출력 위치(기본값: dist/main.js)
Loaders JS 외 파일(CSS, 이미지 등)을 처리하는 방식
Plugins 번들 최적화, HTML 생성 등 추가 기능 확장
Mode 개발(development) 또는 배포(production) 설정

 

 요약

  • Webpack은 모듈 번들러로 여러 파일을 묶어 최적화된 웹 애플리케이션을 만들수있다.
  • Entry, Output, Loaders, Plugins 개념이 중요함
  • CSS, 이미지, Babel 트랜스파일링 등을 처리할 수 있다.

포트폴리오 프로젝트나 대형 프론트엔드 애플리케이션을 개발할 때 필수 도구이다. 😎

'Front-End > JavaScript' 카테고리의 다른 글

바벨-bable  (0) 2025.02.11

Babel (JavaScript 컴파일러)

 Babel이란?

Babel은 최신 JavaScript 코드를 구형 브라우저나 Node.js 환경에서 사용할 수 있도록 ES5로 변환해 주는 컴파일러

Babel 설치

npm install --save-dev @babel/core @babel/preset-env babel-loader

필수 패키지

패키지설명

@babel/core Babel 핵심 패키지
@babel/preset-env 최신 자바스크립트 문법 지원
babel-loader Webpack과 Babel 연동
 

2.4 Babel 사용 방법

1) Webpack과 함께 사용하기

webpack.config.js

const path = require("path");
module.exports = {
  entry: "./src/index.js",
  output: { path: path.resolve(__dirname, "dist"), filename: "main.js" },
  mode: "development",
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: { loader: "babel-loader" },
      },
    ],
  },
};

2) Babel 단독 컴파일

npx babel src --out-dir dist

3. Babel 예제 코드

src/index.js

const greet = (name) => {
  console.log(`Hello, ${name}`);
};
greet("Nell");

컴파일 후 코드 (ES5)

"use strict";
var greet = function greet(name) {
  console.log("Hello, " + name);
};
greet("Nell");

'Front-End > JavaScript' 카테고리의 다른 글

WebPack  (0) 2025.02.11

1. npm (Node Package Manager)

npm 명령어 정리

npm init 프로젝트 초기화 (package.json 생성)
npm init -y 기본 설정으로 바로 초기화
npm install <패키지> 패키지 설치
npm i <패키지> install의 단축어
npm install -g <패키지> 글로벌 설치
npm uninstall <패키지> 패키지 삭제
npm update 패키지 업데이트
npm list 설치된 패키지 확인
npm run <스크립트> package.json에 정의된 스크립트 실행
npm start start 스크립트 실행 (npm run start)와 동일
npm test 테스트 스크립트 실행
npm audit 보안 취약점 검사
npm cache clean --force 캐시 삭제

설치 예제

bash
복사편집
npm install express

스크립트 예제 (package.json)

{
  "scripts": {
    "start": "node index.js",
    "build": "webpack --mode production",
    "test": "jest"
  }
}

 

Spring Swagger란?

SwaggerRESTful API의 문서를 자동으로 생성해주는 도구입니다. Spring Boot 프로젝트에서 주로 Swagger UI를 통해 API 명세를 시각적으로 보여줍니다. 이를 통해 개발자나 클라이언트는 API의 동작 방식과 요청/응답 구조를 쉽게 이해하고 테스트가능

Swagger는 이제 **OpenAPI Specification (OAS)**로 발전했으며, Springdoc OpenAPI 라이브러리를 주로 사용

Swagger의 장점

  1. 자동 API 문서화: 코드 주석 기반으로 자동 문서 생성
  2. API 테스트 용이: Swagger UI에서 직접 API 호출 및 테스트
  3. 개발자 협업 강화: 명확한 API 명세 제공
  4. 버전 관리: API 변경에 따른 문서 자동 업데이트

Spring Boot 프로젝트에 Swagger 적용하기

1. Dependency 추가

<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.7.0</version> </dependency>
 

2. 기본 설정

Spring Boot에서는 추가적인 설정 없이 Swagger가 바로 동작

3. API Documentation 보기

애플리케이션을 실행하고 다음 URL로 접속

  • Swagger UI: http://localhost:7777/swagger-ui.html

4. Controller 예제

import org.springframework.web.bind.annotation.*; 
@RestController 
@RequestMapping("/api") 
public class UserController 
{ 
@GetMapping("/users/{id}") public String getUser(@PathVariable int id) {
return "User with ID: " + id; 
} @PostMapping("/users") public String createUser(@RequestBody String user) { 
return 
"Created user: " + user; } }

Swagger 애노테이션 사용

Swagger 애노테이션을 사용

import io.swagger.v3.oas.annotations.Operation; 
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses; 
import org.springframework.web.bind.annotation.*; 
@RestController @RequestMapping("/api") 
public class ProductController { 
@Operation(summary = "Get a product by its ID") 
@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Found the product", content = {@Content(mediaType = "application/json")}),
@ApiResponse(responseCode = "404", description = "Product not found", content = @Content) }) 
@GetMapping("/products/{id}") public String getProduct(@PathVariable int id) { 
return "Product with ID: " + id; } 
}

Swagger UI 커스터마이징

springdoc.swagger-ui.path=/api-docs springdoc.api-docs.path=/v3/api-docs

Swagger의 주요 대안

  • Redoc: 보다 현대적이고 직관적인 UI 제공
  • Postman: 문서화보다는 API 테스트에 특화
  • Insomnia: Postman 대안으로 API 테스트 제공

Swagger는 효율적인 API 관리와 테스트에 매우 유용하니, 특히 RESTful 서비스를 제공할때 유용함

'Spring' 카테고리의 다른 글

Spring Security  (0) 2025.02.10
WebSocket 예제  (0) 2024.12.05
WebSocket  (0) 2024.12.05
Controller 와 Restcontroller  (0) 2024.11.28
Spring - AutoWired  (0) 2024.11.27

Spring Security스프링 프레임워크 기반의 인증과 권한 부여(Authentication & Authorization)를 담당하는 보안 프레임워크입니다. 웹 애플리케이션과 REST API에서 보안을 강화하기 위해 사용

주요 기능

  1. 인증(Authentication)
    • 사용자가 누구인지 확인하는 과정
    • 예: 로그인 처리
  2. 권한 부여(Authorization)
    • 인증된 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지 확인
    • 예: 관리자 페이지 접근 제한
  3. 보안 공격 방어
    • CSRF(Cross-Site Request Forgery) 방어
    • 세션 고정 공격 방어
    • XSS(Cross-Site Scripting) 방어
    • 클릭재킹 방어
  4. 다양한 인증 방식 지원
    • 기본 폼 로그인
    • HTTP Basic Auth
    • OAuth2/OpenID Connect
    • JWT(Json Web Token) 기반 인증

Spring Security 동작 방식

  1. 사용자가 로그인 요청
  2. UsernamePasswordAuthenticationFilter가 요청 처리
  3. 사용자 정보를 AuthenticationManager에 전달하여 인증 시도
  4. 인증 성공 시 SecurityContext에 사용자 정보 저장
  5. 이후 모든 요청은 SecurityContext를 통해 인증 정보 활용

간단한 구성 예제

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .antMatchers("/", "/public").permitAll()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }

    @Bean
    @Override
    protected UserDetailsService userDetailsService() {
        User.UserBuilder users = User.withDefaultPasswordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("user").password("password").roles("USER").build());
        manager.createUser(users.username("admin").password("admin").roles("ADMIN").build());
        return manager;
    }
}

설명

  1. /admin/** 경로는 ADMIN 권한만 접근 가능
  2. /user/** 경로는 USER 또는 ADMIN 권한으로 접근 가능
  3. / 및 /public 경로는 모두 허용
  4. 기본 로그인 폼 제공

확장 개념

  1. JWT 기반 인증: REST API에서는 세션 대신 JWT로 인증 정보를 전달
  2. OAuth2 인증: 소셜 로그인 (Google, Facebook) 연동
  3. 커스텀 필터: 사용자 정의 인증 로직 적용

 

Spring Security 아키텍처 개요

Spring Security는 다양한 컴포넌트와 레이어로 구성되어 있으며, 이를 통해 인증(Authentication) 및 **권한 부여(Authorization)**를 처리합니다. 아래는 주요 구성 요소와 그 역할입니다.


Spring Security 주요 구성 요소

1. Security Filter Chain

  • 구성: 여러 보안 필터(예: UsernamePasswordAuthenticationFilter)로 이루어진 체인
  • 동작: HTTP 요청이 필터 체인을 통과하면서 인증 및 권한 부여를 수행
  • 핵심 클래스: DelegatingFilterProxy

주요 필터

  • SecurityContextPersistenceFilter: 요청마다 SecurityContext 관리
  • UsernamePasswordAuthenticationFilter: 폼 기반 로그인 처리
  • ExceptionTranslationFilter: 인증 또는 권한 오류 처리
  • FilterSecurityInterceptor: 최종 접근 제어 결정

2. Security Context

  • 인증된 사용자의 보안 컨텍스트를 저장
  • SecurityContextHolder를 통해 접근 가능
java
복사편집
SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication();

3. AuthenticationManager

  • 역할: 인증 요청을 처리하여 사용자 인증 정보를 반환
  • 주요 메서드: authenticate(Authentication authentication)

구현체

  • ProviderManager: 여러 AuthenticationProvider를 관리

4. AuthenticationProvider

  • 역할: 특정 인증 방식 처리
  • 예: DaoAuthenticationProvider는 데이터베이스 기반 인증

5. UserDetailsService

  • 역할: 사용자 정보를 로드하는 인터페이스
  • 커스터마이징: DB 연동 시 재정의 필요
java
복사편집
@Service public class CustomUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 사용자 정보 조회 로직 return new User(username, password, authorities); } }

6. GrantedAuthority

  • 역할: 사용자의 권한을 나타냄
  • 예: ROLE_USER, ROLE_ADMIN

7. AccessDecisionManager

  • 역할: 요청에 대해 허용 또는 거부 결정
  • 구성 요소: AccessDecisionVoter 목록으로 결정

동작 흐름

  1. 요청(Request) 진입
    • 사용자의 HTTP 요청이 필터 체인으로 전달
  2. 인증(Authentication)
    • AuthenticationManager가 사용자 인증 처리
  3. 보안 컨텍스트 저장
    • SecurityContextHolder에 인증 정보 저장
  4. 권한 부여(Authorization)
    • AccessDecisionManager가 권한 확인
  5. 요청 처리 후 응답

Spring Security 아키텍처 다이어그램

rust
복사편집
Client -> Security Filter Chain -> AuthenticationManager -> AuthenticationProvider -> UserDetailsService -> Database/User Store -> SecurityContextHolder

커스터마이징 포인트

  1. 커스텀 UserDetailsService: 사용자 정보 조회 로직
  2. AuthenticationProvider: 커스텀 인증 처리
  3. Security Filter 추가: JWT 토큰 인증 등
  4. AccessDecisionVoter: 권한 체크 로직 커스터마이징

 

 

 

 

'Spring' 카테고리의 다른 글

Spring Swagger  (0) 2025.02.10
WebSocket 예제  (0) 2024.12.05
WebSocket  (0) 2024.12.05
Controller 와 Restcontroller  (0) 2024.11.28
Spring - AutoWired  (0) 2024.11.27
1. 엔티티 매핑 관련
어노테이션설명
@Entity 클래스가 JPA 엔티티임을 나타냅니다.
@Table(name = "table_name") 엔티티와 매핑되는 테이블 이름을 지정합니다.
@Id 기본 키 필드를 지정합니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) 기본 키 값을 자동 생성합니다.
@Column(name = "column_name") 특정 필드를 테이블 컬럼과 매핑합니다.
@Transient 데이터베이스에 저장하지 않는 필드를 선언합니다.
@Embedded 값 타입 객체를 포함시킬 때 사용합니다.

예시 코드

package com.example.demo.hr;

import java.sql.Date;
import java.util.List;

import org.hibernate.annotations.BatchSize;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.annotation.Generated;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString(exclude={"job","manager","dept"})
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="tbl_employees")
public class EmpEntity {

	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	Long employee_id;
	
	String first_name;
	String last_name;
	String email;
	String phone_number;
	Date hire_date;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="job_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	JobEntity job;
	
	Long salary;
	Double commission_pct;
	//fetch는 조회연관,cascade는 DML 연관 (나의 ENTITY 변화가 연관관계 ENTITY 영향)
	@ManyToOne
	@JoinColumn(name="manager_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	EmpEntity manager;
	
	
	@ManyToOne(cascade =CascadeType.ALL ,
			fetch=FetchType.LAZY)
	@JoinColumn(name="department_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	DeptEntity dept;
	


}
 

2. 연관 관계 매핑

어노테이션설명
@OneToOne 1:1 관계를 매핑합니다.
@OneToMany 1:N 관계를 매핑합니다.
@ManyToOne N:1 관계를 매핑합니다.
@ManyToMany N:M 관계를 매핑합니다.
@JoinColumn(name = "fk_name") 외래 키 컬럼을 지정합니다.
@JoinTable 다대다 관계에서 조인 테이블을 지정합니다.
@Cascade (Hibernate) 연관된 엔티티에 대한 연산을 전파합니다.

 

3. 데이터 로딩 방식 (FetchType)

어노테이션설명
fetch = FetchType.LAZY 지연 로딩
fetch = FetchType.EAGER 즉시 로딩

4. 상속 매핑

어노테이션설명
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 단일 테이블 전략
@DiscriminatorColumn(name = "type") 상속된 엔티티 타입 구분 컬럼 지정

5. 기타 유용한 어노테이션

어노테이션설명
@Enumerated(EnumType.STRING) Enum 타입 필드를 문자열로 저장
@Temporal(TemporalType.DATE) 날짜 및 시간 매핑
@Lob 대용량 데이터 매핑
@PrePersist, @PostLoad 엔티티 생명주기 이벤트 처리

6. 생명주기 이벤트 콜백

어노테이션설명
@PrePersist 엔티티가 저장되기 전에 호출
@PostPersist 엔티티가 저장된 후 호출
@PreUpdate 업데이트 전에 호출
@PostUpdate 업데이트 후 호출
@PreRemove 삭제 전에 호출
@PostRemove 삭제 후 호출
@PostLoad 엔티티 조회 후 호출

'SpringBoot > JPA' 카테고리의 다른 글

JPA EAGER / LAZY  (0) 2025.02.06
JPQL  (0) 2025.02.03

JPA에서 EAGER와 LAZY는 엔티티 연관 관계를 조회할 때 데이터 로딩 방식을 지정하는 FetchType 옵션이다.

1. EAGER (즉시 로딩)

  • 연관된 엔티티를 즉시 조회합니다.
  • 부모 엔티티를 조회할 때 연관된 자식 엔티티도 즉시 함께 가져옵니다.

특징

  • N+1 문제가 발생할 수 있음
  • 즉시 로딩이므로 불필요한 데이터가 로드될 가능성 있음
  • 연관 데이터가 반드시 필요한 경우 적합

코드 예시

@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="job_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	JobEntity job;

 

2. LAZY (지연 로딩)

  • 연관된 엔티티를 실제로 접근하는 시점에 조회합니다.
  • Proxy 객체를 통해 데이터를 필요할 때만 로딩합니다.

특징

  • N+1 문제를 예방할 수 있음 (JPQL 또는 Fetch Join으로 최적화 가능)
  • 필요할 때만 데이터를 로드하여 메모리와 성능 최적화
  • 연관 데이터가 필수적이지 않을 경우 적합

코드 예시

@Entity public class Parent { @OneToMany(fetch = FetchType.LAZY) private List<Child> children; }

EAGER vs LAZY 요약

특징EAGER LAZY

로딩 시점 즉시 지연
성능 이슈 N+1 문제 위험 최적화 가능
사용 사례 데이터 필수 데이터 선택적

권장 사항

  • 기본적으로 FetchType.LAZY를 사용하는 것이 좋다
  • 필요한 경우에만 JPQL의 fetch join이나 @EntityGraph를 통해 최적화 하는것이 좋다

'SpringBoot > JPA' 카테고리의 다른 글

JPA 어노테이션  (0) 2025.02.06
JPQL  (0) 2025.02.03

ThymeleafSpring Boot와 함께 주로 사용되는 서버사이드 템플릿 엔진입니다. HTML 파일을 기반으로 데이터를 동적으로 렌더링하여 웹 페이지를 생성할 수 있게 해줍니다.


🛠️ Thymeleaf의 주요 특징

  1. HTML 친화적
    • 순수 HTML 문서에 Thymeleaf 태그 속성(th:text, th:if 등)을 추가하여 동적 콘텐츠를 렌더링합니다.
    • 브라우저에서도 정상적으로 렌더링되기 때문에 디자이너와 개발자 간 협업이 수월합니다.
  2. Spring 통합
    • Spring MVC와 자연스럽게 통합되어 모델 데이터를 뷰에 전달하는 데 적합합니다.
  3. 서버사이드 렌더링
    • 서버에서 데이터를 채워 클라이언트에 완성된 HTML을 전달합니다.
  4. 조건부 렌더링, 반복 지원
    • 동적으로 HTML 요소를 추가하거나 반복 처리할 수 있습니다.

🌟 기본 사용 예제

1. Controller 예제

java
복사편집
@Controller public class HomeController { @GetMapping("/greet") public String greet(Model model) { model.addAttribute("name", "사용자님"); return "greet"; // greet.html 렌더링 } }

2. Thymeleaf 뷰 (greet.html)

html
복사편집
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Thymeleaf Example</title> </head> <body> <h1 th:text="'안녕하세요, ' + ${name} + '!'" ></h1> </body> </html>

🔧 주요 기능

기능설명예제

텍스트 출력 데이터 바인딩 후 출력 th:text="${data}"
조건부 처리 조건에 따라 렌더링 th:if="${condition}"
반복 처리 리스트 반복 출력 th:each="item : ${list}"
링크 처리 동적 URL 생성 th:href="@{/home}"

🎯 왜 사용하나요?

  • JSP보다 현대적인 방식으로 HTML 친화적입니다.
  • Spring Boot 프로젝트에 최적화되어 있고 설정이 간단합니다.
  • 프론트엔드 디자이너와 협업하기 쉬운 템플릿 엔진입니다.

+ Recent posts