오늘은 부트캠프 37일차다. 오늘은 알고리즘을 공부를 하고 오후에 스프링부트 복습을 하려고 했는데 점심먹다가 갑자기 코피가 쏟아져나오는데 멈추질 않아서 일단 병원으로 급히 갔다. 그러고나서 얼른 지혈을 하고 내일 다시 병원에 가야할 거 같다. 이유는 겨울이라서 그런지 코 안에이 많이 건조해지면서 점막이 약해져서 그렇다고 한다. 공부하는 것도 중요하지만 몸관리도 잘해야겠다는 생각이 든다.
오늘 배운 것
1. 스프링 빈(Spring Bean)
-Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다.
-Spring에 의하여 생성되고 관리되는 자바 객체이다.1-2. 제저의 역전(IoC, Inversion Of Control)
-각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성하고 조작하는 작업(객체를 직접 생성하며 메소드 호출)을 한다.
-사용자는 객체를 직접 생성하지 않고, 객체릐 생명주기를 컨트롤하는 주체는 다른 주체가 된다.2. Annotation
-클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다.
-코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.2-1. Spring의 대표적인 Annotation과 역할
2-1-1. @Component
-개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다.
-Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록한다.@Component(value="myman") public class Man { public Man() { System.out.println("hi"); } }
2-1-2. @ComponentScan
-Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면,
Context에 bean으로 등록한다. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로
등록해준다.2-1-3. @Bean
-@Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용한다.
2-1-4. @Controller
-Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation이다.
@Controller //이 Class는 Controller 역할을 한다. @RequestMapping("/user") //이 Class는 /user로 들어오는 요청을 모두 처리합니다. public class UserController { @RequestMapping(method = RequestMethod.GET) public String getUser(Model model) { // GET method, /user 요청을 처리 } }
2-1-5. @RequestHeader
-Request의 header값을 가져올 수 있으며, 해당 Annotation을 쓴 메소드의 파라미터에 사용합니다.
@Controller //이 Class는 Controller 역할을 합니다. @RequestMapping("user") //이 Class는 /user로 들어오는 요청을 모두 처리합니다. public class UserController { @RequestMapping(method = RequestMethod.GET) public String getUser(@RequestHeader(value="Accept-Language")String acceptLanguage) { //GET method, /user 요청을 처리 } }
2-1-6. @RequestMapping
-@RequestMapping(value="")와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가
실행된다. Controller 객체안의 메서드와 클래스에 적용 가능하며, 아래와 같이 사용합니다.
-class 단위에 사용하면 하위 메소드에 모두 적용됩니다.
-메서드에 적용되면 해당 메서드에서 지정한 방식으로 URI를 처리합니다.@Controller //이 Class는 Controller 역할을 합니다 @RequestMapping("/user") //이 Class는 /user로 들어오는 요청을 모두 처리합니다 public class UserController { @RequestMapping(method = RequestMethod.GET) public String getUser(Model model) { //GET method, /user 요청을 처리 } @RequestMapping(value = "/info", method = RequestMethod.GET) public String addUser(Model model) { //GET method, /uesr/info 요청을 처리 } }
2-1-7. @RequestParam
-URL에 전달되는 파라미터를 메서드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용합니다.
-Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킵니다.@Controller @RequestMapping("/user") public class UserController { @RequestMapping(method = RequestMethod.GET) public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age { //GET method, /user 요청을 처리 //http://naver.com?nickname=dog&old=10 String sub = nickname + "_" + age; ''' } }
2-1-8. @RequestBody
-Body에 전달되는 데이터를 메서드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용합니다. 클라이언트가
보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환한다.
-클라이언트가 body에 json or xml과 같은 형태로 값(주로 객체)를 전송하면, 해당 내용을 Java Oject로 변환한다.@Controller @RequestMapping("/user") public class UserController { @RequestMapping(method = RequestMethod.POST) public String addUser(@RequestBody User user) { //POST method, /user 요청을 처리 } }
2-1-9. @ModelAttribute
클라이언트가 전송하는 HTTP parameter, Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 연결(바인딩)합니다. RequestBody와 다르게 HTTP Body 내용은 multipart/form-data 형태를 요구합니다. @RequestBody가 json을 받는 것과 달리 @ModenAttribute 의 경우에는 json을 받아 처리할 수 없습니다.
@ResponseBody
@ResponseBody은 메소드에서 리턴되는 값이 View 로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 됩니다. return 시에 json, xml과 같은 데이터를 return 합니다.@Controller // 이 Class는 Controller 역할을 합니다 @RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다. public class UserController { @RequestMapping(method = RequestMethod.GET) @ResponseBody public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age { // GET method, /user 요청을 처리 // https://naver.com?nickname=dog&old=10 User user = new User(); user.setName(nickname); user.setAge(age); return user; } }
2-1-10. @Autowired
Spring Framework에서 Bean 객체를 주입받기 위한 방법은 크게 아래의 3가지가 있습니다. Bean을 주입받기 위하여 @Autowired 를 사용합니다. Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name 확인) Bean을 주입합니다.
@Autowired
생성자 (@AllArgsConstructor 사용)
setter2-1-11. @GetMapping
RequestMapping(Method=RequestMethod.GET)과 똑같은 역할을 하며, 아래와 같이 사용합니다.
@Controller // 이 Class는 Controller 역할을 합니다 @RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다. public class UserController { @GetMapping("/") public String getUser(Model model) { // GET method, /user 요청을 처리 } //////////////////////////////////// // 위와 아래 메소드는 동일하게 동작합니다. // /////////////////////////////////// @RequestMapping(method = RequestMethod.GET) public String getUser(Model model) { // GET method, /user 요청을 처리 } }
2-1-12. @PostMapping
RequestMapping(Method=RequestMethod.POST)과 똑같은 역할을 하며, 아래와 같이 사용합니다.
@Controller // 이 Class는 Controller 역할을 합니다 @RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다. public class UserController { @RequestMapping(method = RequestMethod.POST) public String addUser(Model model) { // POST method, /user 요청을 처리 } //////////////////////////////////// // 위와 아래 메소드는 동일하게 동작합니다. // //////////////////////////////////// @PostMapping('/') public String addUser(Model model) { // POST method, /user 요청을 처리 } }
2-1-13. @SpringBootTest
Spring Boot Test에 필요한 의존성을 제공해줍니다.
// DemoApplicationTests.java package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() { } } @Test JUnit에서 테스트 할 대상을 표시합니다.
3. Lombok의 대표적인 Annotation과 역할
-Lombok은 코드를 크게 줄여주어 가독성을 크게 높힐 수 있는 라이브러리입니다. 대표적인 Annotation은 아래와 같습니다.
3-1. @Setter
Class 모든 필드의 Setter method를 생성해줍니다.
3-2. @Getter
Class 모든 필드의 Getter method를 생성해줍니다.
3-3. @AllArgsConstructor
Class 모든 필드 값을 파라미터로 받는 생성자를 추가합니다.