Hyun's Wonderwall

[백엔드] 스터디 - Spring Boot 어노테이션 몇가지 정리 본문

Study/Java, Spring

[백엔드] 스터디 - Spring Boot 어노테이션 몇가지 정리

Hyun_! 2023. 5. 15. 17:54

김영한 <스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술>을 공부하며 추가적으로 공부한 것을 정리한 것입니다.


스프링 프레임워크는 MVC패턴을 사용. [Model View Controller]

Controller : 화면(View)과 비즈니스 로직(Model)를 연결시키는 다리 역할
(
화면에서 /aa로 가줘~ 요청하면 주소 받아 어디로 갈지 분석하고 맞는 길로 연결)

=> Controller는 매핑을 한다.

매핑? 하나의 값이 다른 값을 가리키도록 하는 것.

-     HTTP 요청을 매핑하는 여러가지 방법: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @RequestMapping 
-     예를 들어 @GetMapping은 입력한 데이터를 URL에 붙여 전송한다.

-     Controller가 있는 클래스에서 매핑을 한 메소드에 @ResponseBody를 붙이면 JSON형식의 데이터가 반환되고 매핑만 있을 시에는 뷰가 반환된다. //참고 https://gilmatnote.tistory.com/11

어노테이션! 자바 소스 코드에 @ 예약어를 추가하여 사용하는 메타데이터.

*메타데이터: 애플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정과 실행 과정에서 "코드를 어떻게 컴파일하고 처리할 것인지" 알려주기 위한 정보

 

어노테이션의 용도

(1) 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공 (ex. @Override 어노테이션은 메소드가 오버라이드된 것임을 컴파일러에게 알려주어 컴파일러가 오버라이드 검사를 하도록 한다.)
(2)
소프트웨어 개발 환경이 빌드나 배포시 코드를 자동으로 생성할 수 있도록 정보 제공
(3)
런타임에 특정 기능을 실행하도록 정보를 제공

//참고 https://hbase.tistory.com/169

 

Class-Level 어노테이션

@Controller :

MVC 패턴Controller 클래스임을 명시.

해당 클래스에서 URL 매핑된 메소드들은 리턴 값으로 viewName(String)을 반환한다.

따라서 ViewResolver를 통해 viewName에 맞는 뷰를 클라이언트에게 제공한다.

+ @RestController, REST API를 제공하는 컨트롤러를 위한 어노테이션

//참고 https://devwithpug.github.io/spring/spring-3/

Method-Level 어노테이션

@ResponseBody :

클라이언트에게 뷰가 아닌 실제 데이터(JSON)를 전송하고 싶을 때 사용.

-      viewResolver 대신에 HttpMessageConverter가 동작.

-      기본 문자처리: StringHttpMessageConverter     (HTTP BODY에 문자 내용 직접 반환)

-      기본 객체처리: MappingJackson2HttpMessageConverter

@RequestBody :

(HTTP 요청 파라미터 형식이 아닌) HTTP BODY 형식의 데이터를 클라이언트에게서 받아서 처리해야 할 때 사용할 수 있는 어노테이션.

 

@GetMapping : 원하는 메소드 매핑을 직접 사용가능. URL에 변수(데이터)를 포함시켜 요청. 데이터를 헤더에 포함하여 전송. 보안취약.
(@GetMapping("hello") =>
요청 urllocalhost:8080/hello)

 

@PostMapping :  URL에 변수를 노출하지 않고 요청. 데이터를 Body에 포함. 보안이 높음.

//참고 https://dejavuhyo.github.io/posts/get-http-post-body-in-springboot/

 

@RequestMapping : 특정 URL로 요청이 들어왔을 때 Controller에서 어떻게 처리할지 정의하는데, 이때 들어온 요청을 특정 메소드와 매핑하기 위해 사용. (value, method 속성 사용)  

//참고 https://backendcode.tistory.com/227

 

@RequestParam : HTTP 요청 파라미터를 쉽게 받을 수 있는 어노테이션

 

+ JSON(Java Script Object Notation) 데이터 형식

keyvalue 한 쌍으로 이루어짐. xml 대체 포맷.

var json={"key1":"value1" , "key2":"value2"}

 

Test Case 관련 어노테이션

@Test : 스프링 부트에서는 테스트 메소드 작성시 메소드 앞에 @Test 어노테이션을 명시한다. 각각의 테스트 메서드는 독립적으로 실행되어야 한다. 이를 위해 @AfterEach@BeforeEach를 사용한다.

@SpringBootTest : 스프링 부트를 사용해 Test한다는 것을 명시하며, 스프링 컨테이너와 테스트를 함께 실행한다

@Transactional : 테스트 케이스에 이 어노테이션이 있으면 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 따라서 DB에 테스트 때 변경한 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

@AfterEach : @AfterEach를 붙인 메서드는 각 테스트가 종료될 때 마다 무조건 실행된다. 이를 사용해 메모리 DB에 저장된 데이터를 삭제할 수 있다 (clearStore() 메서드 작성.)

@BeforeEach : @BeforeEach를 붙인 메서드는 각 테스트 실행 전에 무조건 실행된다. 이를 사용해 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.

//참고 https://mimah.tistory.com/entry/Spring-Boot-AfterEach-BeforeEach-%EC%98%88%EC%A0%9C

 

Spring Bean 관련 어노테이션

스프링 Bean이란? 스프링 컨테이너(Spring Container, IoC Container)에 등록되어 관리되는 객체들을 말한다. 스프링에서는, 스프링 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입하는 걸 해준다.

 

스프링 빈을 등록하는 두 가지 방법

1.    컴포넌트 스캔과 자동 의존관계 설정

사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법: 클래스 선언부 위에 @Component 어노테이션을 사용하는 것 ('컴포넌트 스캔')

@Controller, @Service, @Repository는 모두 @Component를 포함하고 있다. 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 자동 등록됨.

2.    자바 코드로 직접 스프링 빈 등록

설정 클래스를 만들고 @Configuration 어노테이션을 클래스 선언부 위에 추가. 그리고 특정 타입을 리턴하는 메소드를 만들고 @Bean 어노테이션을 붙여준다.

//참고 https://dev-coco.tistory.com/69

 

@Autowired : 스프링 컨테이너에 등록한 빈에게 의존관계 주입이 필요할 때 DI를 도와주는 어노테이션. 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

 

* DI(의존성 종속, Dependency Injection)

클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것.

-      Dependency, 객체가 다른 객체와 상호작용하는 것.

-      DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있는데 생성자 주입을 권장.
-      @Autowired
를 통한 DI helloController, memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다. 컨테이너에 없으니까!

 

+ 그외 수업자료에 등장하는 어노테이션들

-      엔티티 매핑 어노테이션 (JPA) - @Entity

-      기본키 매핑 어노테이션 - @Id @GeneratedValue

-      AOP(관점지향 프로그래밍)에 사용하는 어노테이션 - @Aspect, @Around