keembloo

스프링 기본 패턴과 어노테이션(Annotation) 본문

Spring

스프링 기본 패턴과 어노테이션(Annotation)

keembloo 2023. 10. 4. 10:08
728x90

 

어노테이션(Annotation)

 

- 사전적 의미로는 주석

- 클래스와 메소드에 추가하여 특별한 의미, 기능을 수행하도록 하는 기술

- 장점 : 코드량이 감소하고 유지보수하기 쉽다. 생산성이 증가한다.

 

어노테이션의 종류는 2가지로 나뉜다

 

 

1. 표준 어노테이션

자바가 기본적으로 제공하는 어노테이션

ex) @Override

 

2. 메타 어노테이션

메타 데이터를 제공하는 어노테이션(어노테이션을 위한 어노테이션)

 

메타 데이터

- 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보
- 스프링 프레임워크를 사용하는데 있어서 중요함
- 스프링은 라이브러리자체를 제공함

 

 


자주쓰는 어노테이션

 

< 1 > 스프링

 

1. @SpringBootApplication

스프링 부트 실행 관련 제공

 

 

2.@ServletComponentScan

서블릿을 찾아서 컨테이너에 빈 등록

 

 

3.@Autowired

컨테이너에서 빈 찾아서 객체를 주입한다

 

스프링 프레임워크에서 빈 객체를 주입받기 위한 방법은 3가지가 있다

@Autowired
생성자 (@AllArgsConstructor 사용)
setter

 

 

4.@Bean

개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 등록할때 사용한다

 

 


 

< 2 >  MVC

 

 

1. @Component

개발자가 생성한 class를 Bean에 등록할때 사용하는 어노테이션

 

 

2. @ComponentScan

스프링은 @ Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면

bean (스프링 컨테이너 = 스프링이 객체들을 관리하는 메모리공간 )으로 등록한다.

@ComponentScan 어노테이션이 있는 클래스의 하위 패키지를 스캔한다.

상위 패키지는 검색 불가능 하다 (동일 패키지, 하위 패키지는 가능)

 

 

3. @Controller

스프링에게 해당 클래스가 Controller 역할을 한다고 명시하기 위해 사용한다.

서블릿 기능을 제공받는다.

 

4. @RestController

스프링에게 해당 클래스가 Controller 역할을 한다고 명시하기 위해 사용한다.

Controller와 차이점은 @ResponseBody 를 생략할 수 있다.

해당 클래스내 모든 함수들은 자동으로 @ResponseBody 주입된다.

 

 

5. @ResponseBody

리턴(반환)되는 값이 View 로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다

return 시에 json , XML 데이터를 반환한다.

해당 함수의 반환타입에 따른 응답타입을 자동 설정해준다

 

response.setContentType 해당 함수의 반환타입
String "text/html; charset=utf-8"
Dto "application/json; charset=utf-8"
List  "application/json; charset=utf-8"

 

return에 응답할 데이터 작성

 

response.setContentType("text/html; charset=utf-8"); public String deleteOrange ( ) { }
response.getWriter().printIn("정상응답");  return "정상응답";

 

  - JSP 프로젝트 사용했던 ObjectMapper 사용할 필요가 없어짐
            ObjectMapper objectMapper = new ObjectMapper();
             String json =  objectMapper.writeValueAsString( loginDto );

 

6. @RequestMapping

들어온 요청과 어노테이션의 value 값이 일치하면 해당 클래스나 메소드가 실행된다.

Controller 객체 안에서 적용 가능하다.

매핑 즉 연결해준다.

 

외부 HTTP 요청으로부터 해당 함수와 매칭을 연결해주는 어노테이션

주의점 : 프로젝트내 절대적으로 동일한 매핑URL과 HTTP함수 모두 동일하게 정의할수 없다

해당 클래스내 메소드 매핑URL들의 공통 URL 정의 가능

 

7. @GetMapping

HTTP 요청 GET 함수 매핑

 

 

8. @PostMapping

HTTP 요청 Post 함수 매핑

 

 

9. @PutMapping

HTTP 요청 Put 함수 매핑

 

 

10. @DeleteMapping

HTTP 요청 Delete 함수 매핑

 

 

11. @Service

스프링에게 해당 클래스가 Service 역할을 한다고 명시하기 위해 사용한다.

 

컨트롤러와 서비스의 차이

컨트롤러 - 매핑만 함

서비스 - 로직만 짬

컨트롤러와 서비스를 나눈 이유 : 매핑과, 로직 함께 작성하면 복잡하니까

 

 

12. @RequestParam 

 

URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜서 파라미터를 받아서 처리할 수 있게 한다

JSON형식의 BODY를 JAVA 객체로 변환시킨다

즉 쿼리스트링 형식의 요청 매개변수 매핑

URL?매개변수=값?매개변수=값

 

 

13. @PathVariable 

 

경로상의 매개변수 형식의 요청 매개변수 매핑 

URL/값/값

 

 

14. @RequestBody

 

Body에 전달되는 데이터를 메소드의 인지와 매칭시켜 데이터를 받아서 처리할 수 있게 한다

클라이언트가 보내는 HTTP 요청 본문(JSON , XML 등) 을 JAVA 오브젝트로 변환한다

즉   HTTP body( Post/Put ) 형식의 요청 매개변수를 객체로 매핑 (JSON)

 

 

15. @ModelAttribute

 

클라이어트가 보내는 HTTP 인자, BOCY 내용을 Setter 함수를 통해 1:!로 객체에 데이터를 연결한다

RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구한다.

RequestBody 와 차이점 : RequestBody가 json을 받는 것과 달리 ModenAttribute 의 경우에는 json 처리 불가능.

 

 

16. @Repository

Spring 에서 리포지토리 


 

< 3 > Lombok

Lombok은 코드를 크게 줄여주어 가독성을 크게 높힐 수 있는 라이브러리.

 

 

1. @NoArgsConstructor

 

빈생성자 자동 생성

 

 

2. @AllArgsConstructor

 

풀생성자 자동 생성

 

 

3. @Getter     

 

필드의 getter메소드 자동 생성

 

 

4. @Setter     

 

필드의 setter메소드 자동 생성

 

 

5. @ToString     

 

필드의 toString메소드 자동 생성

 

 

6. @Builder

 

필더 패턴 유연하게(생성자 단점 보완 ) 객체 생성 도와주는 함수 제공

생성자의 파라미터 순서, 갯수에 상관없이 쓸 수 있게 해준다.

 

 

 

 

 


 

 

- 스프링 부트 시작

꼭 main 스레드 안에서 작성해야한다

   public static void main(String[] args) {
        SpringApplication.run(현재클래스명.class)
    }

 

- 주의할점

@SpringBootApplication 를 사용하는 해당 클래스는 항상 최상위 위치에 생성해야한다

 


 

- 내장 톰캣 사용시 port 변경하는 방법

 

프로젝트폴더 -> SRC ->  Main -> 리소스 우클릭 -> 파일생성 -> application.properties  이름으로 파일생성한다

스프링에서의 외부설정을 등록하는 곳

파일명에 오타가 있을 경우 스프링이 해당 파일을 못찾아서 설정 등록이 안됨

 

# 주석
# 1. 내장톰캣의 포트 변경
server.port = 8080

 

 

 

 

728x90

'Spring' 카테고리의 다른 글

JPA Auditing 정리  (0) 2023.10.18
Spring 아키텍처  (0) 2023.10.17
Spring 이란? 스프링 기본 정리  (0) 2023.10.12
다른 클래스 메소드를 호출하는 방법  (0) 2023.10.05
스프링 매핑관련 정리  (0) 2023.10.04