일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 배포
- 게임개발동아리
- UNICON
- UNICON2023
- 도커
- 개발공부
- 42서울
- CICD
- 인프라
- 라피신
- 프로그래밍
- 백엔드개발자
- 프리티어
- UNIDEV
- EC2
- RDS
- 인디게임
- 체크인미팅
- 백엔드
- 온라인테스트
- 자바개발자
- 티스토리챌린지
- 생활코딩
- 스프링
- Developer
- 오블완
- 위키북스
- 스프링부트
- AWS
- 전국대학생게임개발동아리연합회
- Today
- Total
Hyun's Wonderwall
[백엔드] 스터디 - Spring Boot 어노테이션 몇가지 정리 본문
김영한 <스프링 입문 - 코드로 배우는 스프링 부트, 웹 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") => 요청 url가 localhost: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) 데이터 형식
key와 value 한 쌍으로 이루어짐. 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
'Study > Java, Spring' 카테고리의 다른 글
[GDSC Study] 스프링 기반 REST API 개발 - 2주차 | 섹션 2. 이벤트 생성 API 개발 (0) | 2023.11.14 |
---|---|
[GDSC Study] 스프링 기반 REST API 개발 - 1주차 (섹션 0, 1) (0) | 2023.11.07 |
[백엔드] 스터디 2주차 - Java (4) 배열, 버블 정렬, Arrays 클래스, Random 클래스 (0) | 2023.04.03 |
[백엔드] 스터디 1주차 - Java (3) 연산자, 조건, 반복문 (0) | 2023.03.27 |
[백엔드] 스터디 1주차 - Java (2) 입출력, 변수, 자료형, 캐스팅 (0) | 2023.03.27 |