✅ Annotation 이란?
- 사전적 의미로는 주석이라는 뜻이지만, 자바에서 @Annotation 많은 기능들을 다루는 기술이다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
- 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
- 실행시 특정 기능을 실행하도록 정보를 제공한다.
💡 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다.
자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.위키백과 - 자바 애노테이션
✅ 자주 사용하는 Annotation
♐ @Bean
- method에서 반환된 객체를 Spring Container에 Bean으로 등록할 때 사용한다
- 주로 개발자의 제어가 불가능한 외부 라이브러리에서 method의 반환객체를 Bean으로 만들 때 사용한다
- Bean 이름은 method 이름을 사용한다
- Bean의 이름은 겹치지않도록 항상 서로 다른 이름을 부여해줘야 한다
- @Configuration와 @Bean은 항상 같이 사용해야한다
♐ @ComponentScan
- Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록한다.. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해준다.
♐ @Controller
- Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation이다.
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
♐ @RestController
- @RestController는 @Controller에 @ResponseBody가 추가된 것이다.
📚https://computerreport.tistory.com/98
[Spring] Controller 와 RestContoller 의 차이
✅ Controller 와 RestContoller 의 차이Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있다.전통적인 Spring MVC 컨트롤러인 @Controller와 RESTful 웹 서비스의 컨트롤러인 @
computerreport.tistory.com
♐ @RequestMapping
- @RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행된다.
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
// 회원가입
@PostMapping("/signup")
public ResponseEntity<UserResponseDto> signUp(@Valid @RequestBody UserRequestDto userRequestDto) {
UserResponseDto userResponseDto = userService.signUp(userRequestDto.getName(), userRequestDto.getAge(),
userRequestDto.getEmail(), userRequestDto.getPassword(),userRequestDto.getCheckPassword());
return new ResponseEntity<>(userResponseDto,HttpStatus.CREATED);
}
// 이름으로 유저들 조회(List)
@GetMapping
public ResponseEntity<List<UserResponseDto>> findUserByName(@RequestParam("name") String name) {
List<UserResponseDto> userResponseDtoList = userService.findUserByName(name);
return new ResponseEntity<>(userResponseDtoList,HttpStatus.OK);
}
♐ @RequestParam
- URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용한다.
- Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킵니다.
@GetMapping("/pages")
public ResponseEntity<Page<UserResponseDto>> findUserByNamePage(
@RequestParam("name") String name,
@PageableDefault Pageable pageable) {
Page<UserResponseDto> userResponseDtoPage = userService.findUserByNamePage(name, pageable);
return new ResponseEntity<>(userResponseDtoPage,HttpStatus.OK);
}
♐ @RequestBody
- Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용한다.
- 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환한다.
@PostMapping("/signup")
public ResponseEntity<UserResponseDto> signUp(
@Valid @RequestBody UserRequestDto userRequestDto) {
UserResponseDto userResponseDto = userService.signUp(userRequestDto.getName(), userRequestDto.getAge(),
userRequestDto.getEmail(), userRequestDto.getPassword(),userRequestDto.getCheckPassword());
return new ResponseEntity<>(userResponseDto,HttpStatus.CREATED);
}
♐ @SpringBootTest
- Spring Boot Test에 필요한 의존성을 제공한다.
// DemoApplicationTests.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}
♐ @PathVariable
- 경로 변수를 표시하기 위해 메서드에 매개변수에 사용된다.
- 경로 변수는 중괄호 {id}로 둘러싸인 값을 나타낸다.
- URL 경로에서 변수 값을 추출하여 매개변수에 할당한다.
@GetMapping("/{board_id}/comments")
public ResponseEntity<List<CommentResponseDto>> findByPostId(@PathVariable Long board_id) {
List<CommentResponseDto> commentResponseDtoList = commentService.findByPost(board_id);
return new ResponseEntity<>(commentResponseDtoList, HttpStatus.OK);
}
♐ @Slf4j
- Slf4j는 인터페이스이고 그 구현체로 Logback같은 라이브러리를 선택한다. 실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용한다.
- 클래스를 생성할 때마다 항상 로그를 남기기 위해 Logger 변수를 선언해야 했는데 Lombok의 @Slf4j 어노테이션을 사용하면 자동으로 log 변수를 선언하여 편리하게 log를 찍을 수 있다.
slf4j 사용전
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jSample {
private static final Logger log = LoggerFactory.getLogger(Slf4jSample.class);
public static void main(String[] args) {
log.info("---------- Log 테스트 ---------");
}
}
Gradle 의존성 추가
// Gradle - Groovy
dependencies {
...
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
...
}
// Gradle - Kotlin
dependencies {
...
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
...
}
slf4j 사용후
@Slf4j
public class Slf4jSample {
public static void main(String[] args) {
log.info("---------- Log 테스트 ---------");
}
}
✅ Lombok 라이브러리에서 제공되는 Annotation
♐@Setter
Class 모든 필드의 Setter method를 생성해준다.
♐ @Getter
Class 모든 필드의 Getter method를 생성해준다.
♐ @AllArgsConstructor
Class 모든 필드 값을 파라미터로 받는 생성자를 추가한다.
♐ @NoArgsConstructor
Class 기본 생성자를 자동으로 추가해준다.
♐ @ToString
Class 모든 필드의 toString method를 생성한다.
'Spring' 카테고리의 다른 글
[SPRING/JPA]양방향 관계시 사용하는 CASCADE에 대해 알아보자 (1) | 2025.04.11 |
---|---|
[Spring/JPA] 영속성 컨텍스트 (0) | 2025.04.11 |
[Spring] Controller 와 RestContoller 의 차이 (0) | 2025.04.10 |
[Spring] MVC 패턴 (0) | 2025.04.07 |
[Spring]HTTP 란? (2) (0) | 2025.03.31 |