본문 바로가기

두두의 IT

String Boot Controller Annotation

728x90
@Controller(value="xxx")
@RequestMapping("xxx") 또는 ("/xxx")	//url 값	
@ResponseBody
@RestController
@GetMapping("xxx") 또는 @GetMapping(value="xxx")
@PostMapping("xxx")
@Slf4j
@Autowired
@PersistenceContext
@PathVariable("xxx") String xxx
@RequestParam(required=false, name="xxx") String xxx
@RequestParam(value="xxx", required=false, defaultValue="xxx") Integer xxx
@ModelAttribute("xxx")
@AuthenticationPrincipal Member loginMember
@Transactional

@Controller

  • 사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할
  • 해당 클래스를 Controller로 사용한다고 Spring FrameWork에 알림
  • 필요한 비즈니스 로직을 호출하여 전달할 모델과 이동할 뷰 정보를 DispatherServlet에 반환
  • Bean으로 등록

@RequestMapping

  • 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지 맵핑하기 위한 어노테이션
  • @GetMapping("/login") == @RequestMapping("/login", method=@RequestMethod.GET)
  • @PostMapping("/login") == @RequestMapping("/login", method=@RequestMethod.POST)

 

@RequestBody

  • 해당하는 어노테이션이 붙어있는 메서드로 클라이언트의 요청이 들어왔을 때, DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 requestBody를 통째로 Java Object로 변환해서 메서드로 전달해주게 됩니다.
  • 일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일이 없을 것이고,  xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다.
    • 일반적인 GET 메서드의 요청 경우에는 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라, URI 또는 URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션을 통해 해당 요청 내용을 받을 수가 없고, @PathVariable, @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 합니다.

 

@ResponseBody

  • @ResponseBody 가 붙은 파라미터가 있으면 HTTP요청의 미디어타입과 파라미터의 타입을 먼저 확인하고, MessageConverter 중에서 해당 미디어타입과 파라미터 타입을 처리할 수 있다면, HTTP요청의 본문 부분을 통째로 변환해서 지정된 메소드 파라미터로 전달해준다.

@RestController

  • @Controller와 @ResponseBody의 두 가지 기능을 함

 

@GetMapping

  • GET 요청 방식의 API를 만들때

 

@Slf4j : (Simple logging facade for java)

  • Controller, Service 클래스에서 사용
  • 디버깅을 하면서 여러 문제나 중요한 정보들을 남기고 표시하기 위해 써왔던 system.out.println()은 프로그램의 성능을 떨어트리고 또한 로그를 파일에 저장하는 것이 불가능하기 때문에 자바에서 지원하는 logging 라이브러리를 사용해서 로그를 관리하는게 효율적임
  • 로깅을 간단하게 사용할 수 있도록 하는 Facade로 로깅 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법
  • 로깅에 대한 추상 레이어를 제공하는 인터페이스의 모음이다. (로깅 Facade)
  • 인터페이스를 사용하여 로깅을 구현하게 되면 좋은 점은 추후에 필요로 의해 로깅 라이브러리를 변경할 때 코드의 변경 없이 가능하다는 점이다.
  • 메서드에서 log.~~ 처럼 사용 가능

@Autowired

  • Controller, Service 클래스에서 사용
  • 스프링 컨테이너에 빈으로 등록되어있는 객체를 자동으로 주입해준다.
  • 생성자, setter, 필드의 경우에 Autowired를 사용할 수 있다. 
  • Autowired는 기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동에 실패한다.
//필드 주입
public  class  Example{

    @Autowired
    private OneService oneService;
 
    @Autowired
    private TwoService twoService;
}

//생성자 주입
public  class  Example{
 
    private final OneService oneService;
    private final TwoService twoService;
 
    @Autowired	//생략 가능
    public ExampleCase(OneService oneService, TwoService twoService){
        this.oneService = oneService;
        this.twoService = twoService;
    }
}

 

[필드주입이 아닌 생성자 주입을 사용하는 이유]

1. 순환 의존성 확인
필드 주입으로 순환 의존성을 파악하기는 어렵습니다. 생성자 주입을 하게 되면 서버 기동시 순환 의존성을 가지는 요소들을 파악할 수 있게 에러 메세지를 표시 하면서 서버 기동이 되지 않습니다. 

2. 불변성
필드 주입은 final를 선언할 수 없지만 생성자 주입은 final를 선언함으로써 객체가 변하지 않도록 방지해줍니다.

3. 단일 책임 원칙 위반 확인
Lombok을 사용하지 않았을때 필드 주입을 하게 되면 코드량이 상당히 많아지고 생성자를 확인하여 얼마나 많은 요소들을 사용하지는 한눈에 파악이 가능합니다. "클래스는 한 개의 책임을 가진다" 단일 책임 원칙 위반을 생각해 볼 수 있게 해줍니다. 이로서 클래스를 리펙토링 하거나 클래스를 분리하는 데 도움이 될 수 있습니다. 

 

@PersistenceContext

  • Controller, Service 클래스에서 사용
  • 스프링이 처음 시작할 때, 영속성 관리를 위해 entity manager를 만들어서 빈으로 등록을 해둔다.
  • entity manager는 @PersistenceContext로 주입을 해줄 수 있다. (최신 스프링부트에서는 @Autowired로도 할 수 있다고 한다.)

https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context

 

[Spring JPA] 영속성 컨텍스트(Persistence Context)

영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻으로 어플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할을 한다.

velog.io

@PathVariable("xxx")

  • Controller 단에서 클라이언트에서 URL에 파라미터를 같이 전달하는 경우 사용
  • RestAPI에서 값을 호출할 때 주로 많이 사용 (http://127.0.0.1/index/1)
  • url에서 각 구분자에 들어오는 값을 처리해야 할 때 사용


@RequestParam(value="xxx", required=false, name="xxx", defaultValue="xxx")

  • 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용 (http://127.0.0.1?index=1&page=2)
  • RequestParam 변수의 값을 메서드 인자로 할당 할 수 있다.
  • value : ??
  • required=false : 해당 변수명으로 대응되는 값이 없지만 예외를 발생시키지 않도록 할 때
  • name : RequestParam의 변수와 URL 변수를 동일하게 쓰고싶을 때
  • defaultValue : 값이 없을 때 기본값
  • GET 요청시


@ModelAttribute("xxx")

  • 클라이언트에서 요청한 multipart/form-data 형태의 HTTP BODY를 setter를 통해 오브젝트 형태로 맵핑해주는 어노테이션
  • 외부 데이터가 bean에 등록된 객체로 자동으로 변환되어 사용할 수 있도록 하는 것
  • @ModelAttribute를 사용할 때 내부적으로는 객체로 정의한 클래스파일의 bean 객체를 만든 후에 setter를 타고 바인딩된다.
  • 객체가 mutable한 객체여야 @ModelAttribute 어노테이션을 사용할 수 있다. (setter가 없다면 매핑에 실패하여 null을 갖게 된다.)
  • 괄호 안에 문자열을 지정해 주면 view단에 Model객체로 넘겨줄 때 해당 문자열로 추가되어 view 단에서 사용할 수 있다.
  • GET 요청시 : 기본적으로 객체의 setter로 받아옴 (디폴트값 => 권장)
  • POST 요청 시 : application/X-FORM-ENCODED 형식으로 데이터 받을 때 사용


@AuthenticationPrincipal

  • 로그인한 사용자 정보를 받아 사용할 수 있다.
  • 엔티티 객체 받아올 수 있음
  • 애플리케이션에서 로그인한 사용자와 관련된 특정한 정보들을 조회할 때 매번 사용자가 서버에 요청을 보낼때마다 DB에 접근해서 데이터를 가져오는 것은 그 자체로 비효율적이다. 따라서 한번 인증된 사용자 정보를 세션에 담아놓고 세션이 유지되는 동안 유저객체를 DB접근 없이 가져다 쓰는 것을 생각 해볼 수있다. Spring Security에선 이 정보를 SecurityContextHolder내부의 SecurityContext에 Authentication 객체로 저장해두고 있으며, 이를 참조하는 방법 3가지 중 하나임


@Transactional

  • Controller, Service, Dao 클래스에서 사용

'두두의 IT' 카테고리의 다른 글

String Boot Model Annotation  (0) 2022.05.20
MAC + Flutter + xCode 설치  (0) 2022.05.18
intelliJ Web Project 폴더 분석  (0) 2022.05.16
MySQL 공부  (0) 2022.05.07
멀티모듈 설정  (0) 2022.05.06