본문 바로가기
웹 개발/Back End

스프링 개념 정리(1)

by L3m0n S0ju 2022. 8. 27.

 

 

스프링과 Vue.js로 블로그를 만들고 있다. 지금까지 CRUD 기능을 구현하였는데 중간점검을 위해서 지금까지 배운 것들을 정리해보려고 한다. 코드는 아래 commit에서 확인할 수 있다.

 

 

https://github.com/Lemon-soju/Vue_Spring/commit/67e89498fde5d403de7f1dd44f450dbb896ad3f7

 

Delete Posts · Lemon-soju/Vue_Spring@67e8949

Show file tree Showing 4 changed files with 49 additions and 0 deletions.

github.com

 

 

 

 

 

 

 


[ Spring Bean 이란? ]

Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. Spring의 Bean을 정리하면 아래와 같다.

  • POJO(Plain Old Java Object)로써 Spring 애플리케이션을 구성하는 핵심 객체이다.
  • Spring IoC 컨테이너(또는 DI 컨테이너)에 의해 생성 및 관리된다.
  • class, id, scope, constructor-arg 등을 주요 속성으로 지닌다.

 

 

 

 

[ Spring Bean 구성 요소 ]

  • class: Bean으로 등록할 Java 클래스 
  • id: Bean의 고유 식별자 
  • scope: Bean을 생성하기 위한 방법(singleton, prototype 등) 
  • constructor-arg: Bean 생성 시 생성자에 전달할 파라미터 
  • property: Bean 생성 시 setter에 전달할 인수 

 

Spring에서는 위와 같은 Bean의 구성 요소를 바탕으로 등록되어 있는 Bean을 싱글톤 객체로 생성하여 관리한다. 그래서 빈을 등록하기 위한 다양한 방법들을 제공한다.

 

출처: https://mangkyu.tistory.com/75 [MangKyu's Diary:티스토리]

 

 


 

 

@Configuration

 

스프링 설정 캘래스를 선언하는 어노테이션

 

 

 

 

JPAQueryFactory

 

설정파일에서 프로젝트 전역에서 QueryDSL을 사용할 수 있도록 Bean에 등록한다. 

 

 

 

 

 

@PersistenceContext

 

스프링에서 영속성 관리를 위해 Entity Manager가 존재한다. 해당 어노테이션은 스프링이 처음 시작할 때, entity manager를 만들어서 빈으로 등록을 해둔다. entity manager는 @Autowired가 아니고 특별하게 @PersistenceContext라는 어노테이션으로 주입을 해줄 수 있다. 하지만 최신 스프링부트에서는 @Autowired로도 할 수 있다고 한다.

 

 

 

 

 

 

 

 

 


// JSON 형식의 requestBody
{
    "id": "test0101",
    "email": "test0101@gmail.com"
}

// requestBody 요청을 매핑시킬 Java Object
public class Member {
    private String id;
    private String email;
}

 

@RequestBody

@RequestBody 어노테이션은 HttpRequest의 본문 requestBody의 내용을 자바 객체로 매핑하는 역할을 합니다.

해당하는 어노테이션이 붙어있는 메서드로 클라이언트의 요청이 들어왔을 때, DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달해주게 됩니다.

 

 

이때 주의할 점으로는 일반적인 GET 메서드의 요청 경우에는 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라, URI 또는 URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션을 통해 해당 요청 내용을 받을 수가 없는데요. 

GET 메서드의 경우 @PathVariable, @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 합니다.

 

(GET 메서드에도 body 값을 실어서 요청을 보낼 수 있지만, 설계적인 문제나 클라이언트에서 지원하지 않을 경우가 있을 수 있음)

 

 

 

 

 

 

 

// responseBody로 매핑시킬 결과 Java Object
public class ResponseTransfer {
    private String text;
}

// Java Object가 매핑된 responseBody
{"text" : "Response OK"}

 

@ResponseBody

@ResponseBody 어노테이션은 자바 객체를 HttpResponse의 본문 responseBody의 내용으로 매핑하는 역할을 합니다.

해당 어노테이션 마찬가지로 return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달하게 되는데요.

 

위 예시 코드를 보면 @ResponseBody가 생략되었는데, 그 이유는 Controller에 붙은 @RestController 때문입니다.

아래 @RestController 어노테이션을 살펴보면 @Controller와 @ResponseBody가 둘 다 붙어있는 것을 볼 수 있는데요.

 

이처럼 @RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로 HttpResponse의 본문 responseBody에 자바 객체가 매핑되어 전달됩니다.

 

 

 

 

 

 

 

 

 


@ResponseStatus

 

해당 예외가 발생했을 때 응답 Status를 설정한다.

 

 

 

 

@ExceptionHandler 

 

@ExceptionHandler같은 경우는 @Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 한다.

 

 

 

@ControllerAdvice

@ExceptionHandler가 하나의 클래스에 대한 것이라면, @ControllerAdvice는 모든 @Controller 즉, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 annotation이다.

 

출처: https://jeong-pro.tistory.com/195 [기본기를 쌓는 정아마추어 코딩블로그:티스토리]

 

 

 

 

 

 

 

 

 

 

댓글