Spring

[Spring] Annotation

코딩로봇 2025. 4. 10. 14:31

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를 생성한다.