Spring Annotation 정리

이재용·2025년 1월 1일
0

Spring

@Configuration

해당 클래스를 구성 정보로 사용한다.

@Bean

메서드에 붙여준다. 반환된 객체가 스프링 컨테이너에 스프링 빈으로 등록한다.

@Autowired

의존관계 자동으로 주입

@Component

클래스가 컴포넌트 스캔의 대상이 되도록 해서 스프링 빈으로 등록된다.

@RequiredArgsConstructor

final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.

@NoArgsConstructor(access = AccessLevel.PROTECTED)

파라미터가 없는 기본 생성자를 생성합니다.

@EventListener(ApplicationReadyEvent.class)

스프링 컨테이너가 완전히 초기화를 다 끝내고, 실행 준비가 되었을 때 발생하는 이벤트이다.

MVC

@PathVariable

"/mapping/userA" API에서 @GetMapping("/mapping/{userId}")와 같이 경로를 템플릿화 해서 userA를 뽑아낼 수 있다.

@GetMapping("/mapping/{userId}/orders/{orderId}") 
public String mappingPath(@PathVariable("userId") String data, @PathVariable Long orderId) { 
	log.info("mappingPath userId={}, orderId={}", userId, orderId); 
	return "ok"; 
}

@RequestParam - 요청 파라미터 조회

예시 http://localhost:8080/member?username=hello&age=20

request.getParameter("username")

1. @RequestParam()에 HTTP 파라미터 이름
public String requestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge) {}

2. HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
public String requestParamV3( @RequestParam String username, @RequestParam int age) {}

3. String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
public String requestParamV4(String username, int age) {}

4. 파라미터를 Map으로 조회하기
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {}

@ModelAttribute - 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣기

public class HelloData { private String username; private int age; }
예시 http://localhost:8080/member?username=hello&age=20

1. 자동으로 HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.
public String modelAttributeV1(@ModelAttribute HelloData helloData) {}
2. @ModelAttribute는 생략할 수 있다. String, int, Integer 같은 단순 타입=@RequestParam. 나머지=@ModelAttribute
public String modelAttributeV2(HelloData helloData) {}

@RequestBody - 요청 HTTP message body 조회(TEXT, JSON)

public class HelloData { private String username; private int age; }
예시 HTTP Body에 TEXT or JSON이 넘어오는 상황

1. 메시지 바디 정보를 직접 조회
public String requestBodyJsonV2(@RequestBody String messageBody) {}
2. @RequestBody에 직접 만든 객체를 지정할 수 있다.
public String requestBodyJsonV3(@RequestBody HelloData data) {}

@ResponseBody - 응답 결과를 HTTP message body에 직접 담아서 전달

@ResponseBody 
@PostMapping("/request-body-string-v4")
public String responseBodyV3() {
	return "ok";
}

@ResponseStatus(HttpStatus.OK) 
@ResponseBody 
@GetMapping("/response-body-json-v2") 
public HelloData responseBodyJsonV2() {
	~~~code OR parameter~~~
	return helloData;
}

반환 타입이 원시타입인지 참조타입인지 주의- 참조타입이라면 응답 HTTP message body에 JSON이 들어감(단순 텍스트가 아니라)
@Controller 대신에 @RestController 애노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody 가 적용되는 효과가 있다.

@Controller

반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.

@ResponseBody

뷰 리졸버를 통한 View 조회를 무시하고, HTTP message body에 직접 내용 입력

@RestController

@Controller + @ResponseBody -> 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.

Test

@AfterEach

테스트를 실행한 후에 매번 호출된다. 테스트가 실패해도 수행된다.

@BeforeEach

테스트를 실행하기 전에 매번 호출된다.

@AfterEach, @BeforeAll

전체 테스트 중 한번만 실행

@Transactional

테스트에 있으면 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다

@SpringBootTest

@SpringBootApplication을 찾아서 설정으로 사용한다. = 스프링 부트 띄우고 테스트(이게 없으면 @Autowired 다 실패)
스프링 AOP를 적용하려면 스프링 컨테이너가 필요하다. 이 애노테이션이 있으면 테스트시 스프링 부트를 통해 스프링 컨테이너를 생성한다. 그리고 테스트에서 @Autowired 등을 통해 스프링 컨테이너가 관리하는 빈들을 사용할 수 있다.

@TestConfiguration

테스트 안에서 내부 설정 클래스를 만들어서 사용하면서 이 에노테이션을 붙이면, 스프링 부트가 자동으로 만들어주는 빈들에 추가로 필요한 스프링 빈들을 등록하고 테스트를 수행할 수 있다.

JPA

@PersistenceContext

영속성 컨텍스트를 주입하는 표준 애노테이션

@Entity

DB 테이블에 대응하는 하나의 클래스. JPA가 관리한다.

@Id

데이터베이스 PK와 매핑

@GeneratedValue

PK를 자동으로 생성해주는 애노테이션

@Column

객체의 필드를 테이블의 컬럼과 매핑

@JoinColumn

Entity의 연관관계에서 외래 키를 매핑하기 위해 사용한다.

@Transactional

트랜잭션 처리가 필요한 곳에 붙여주면 된다. 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션 프록시를 적용해준다.
JPA의 모든 데이터 변경(등록, 수정, 삭제)은 트랜잭션 안에서 이루어져야 한다.
readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않으 므로 약간의 성능 향상(읽기 전용에는 다 적용)

@Repository

  1. 컴포넌트 스캔의 대상이 된다. -> 컨테이너에 등
  2. 예외 변환 AOP의 적용 대상이 된다.
    예외 변환 AOP 프록시는 JPA 관련 예외가 발생하면 JPA 예외 변환기를 통해 발생한 예외를 스프링 데이터 접근 예외로 변환한다.(=JPAorJDBC 예외를 스프링이 추상화한 예외로 변환)

@Table

엔티티와 매핑할 테이블 이름 지정

@Embeddable

값 타입을 정의하는 곳에 표시

@Embedded

값 타입을 사용하는 곳에 표시

기타

@Data

@Getter , @Setter , @ToString ,@EqualsAndHashCode , @RequiredArgsConstructor를 자동으로 적용해준다.

0개의 댓글