목록Spring (102)
개발놀이터
*HTTP 요청 메시지 - 단순 텍스트 HTTP message body에 데이터를 직접 담아서 요청 -HTTP API에서 주로 사용, JSON, XML, TEXT -데이터 형식은 주로 JSON 사용 -POST, PUT, PATCH 사용가능 요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없다. 이럴때는 InputStream으로 메시지 바디에 있는 내용을 읽어올 수 있다. @PostMapping("/request-body-string-v1") public void requestBodyString(HttpServletRequest request, HttpServletResponse response) thr..
*HTTP 요청 파라미터 - @RequestParam 스프링이 제공하는 @RequestParam을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다. @RequestMapping("/request-param-v2") public String requestParamV2 (@RequestParam("username") String memberName, @RequestParam("age") int memberAge) { ... } 이런식으로 RequestParam을 이용하면 request.getParameter("username")과 같은 효과를 볼 수 있다. @RequestMapping("/request-param-v3) public String requestParamV3 (@RequestParam S..
*요청 매핑 *@RestController -@Controller는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다. -@RestController는 반환 값으로 뷰를 찾는 것이 아니라 HTTP메시지 바디에 바로 입력한다. @ResponseBody와 관련이 있는데 뒤에서 더 자세히 설명한다. *@RequestMapping("/hello-basic") -/hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다. -대부분 속성을 배열로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"} RequestMapping은 뒤에 method를 한정지을 수 있는데 다음과 같이 적으면 된다. @RequestMapping(valu..
*로깅 운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력한다. 참고로 로그 관련 라이브러리도 많고, 깊게 들어가면 끝이 없기 때문에, 여기서는 최소한의 사용 방법만 알아본다. *로깅 라이브러리 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본적으로 다음 로깅 라이브러리를 사용한다. -SLF4J : http://www.slf4j.org -Logback : http://logback.qos.ch 로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 잇는데, 그것을 통합해서 인터페이스로 제공하는 것이 바..
*스프링 MVC 구조 스프링 MVC의 구조는 다음과 같다 1. HTTP요청이 들어오면 Front Controller인 Dispatcher Servlet이 모든 URL매핑에 반응한다. 2. 그 후에 핸들러(=컨트롤러) 매핑 정보를 기반으로 핸들러를 조회한다. 3. 핸들러마다 다른 기능을 지원하기 위해서 핸들러 어댑터 목록에서 핸들러를 처리할 수 있는 핸들러 어댑터를 조회한다. 4. 핸들러 어댑터를 들고 핸들러를 호출한다. 5. 핸들러를 호출하고 Model And View로 반환해준다. 6. viewResolver를 호출해서 View를 반환받는다. 7. render를 호출해서 랜더링한다. *@Controller -스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 어노테이션이 있어서 컴포..
*빈 스코프 일반적으로 스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 1. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 2. 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 3. 웹 관련 스코프 3-1. request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. 3-2. session : 웹 세션이 생성되고 종료될 때 까지 유지되는 ..
*빈 생명주기 콜백 1. 인터페이스 사용 2. 설정 정보에 초기화 메서드, 종료 메서드 지정 3. @PostConstruct, @PreDestroy 어노테이션 지원 1. 인터페이스 사용 implements InitializingBean, DisposableBean을 선언해준다. 그 후에 afterPropertiesSet(), distroy()메서드를 작성하면 된다. afterPropertiesSet() 은 생성자 호출하고 초기화가 다 끝나면 그때 호출이 된다. distroy()는 스프링이 내려갈때 맨 마지막에 호출해준다. 초기화, 소멸 인터페이스 단점 1. 이 인터페이스는 스프링 전용 인터페이스이다. 해당 코드가 스프링 전용 인터페이스에 의존한다. 2. 초기화, 소멸 메서드의 이름을 변경할 수 없다. 3..
*@Autowired 스프링 빈의 의존관계를 자동으로 주입해주는 어노테이션이다. @Component 어노테이션으로 컴포넌트 스캔으로 등록된 클래스에서만 사용이 가능 하다. 컴포넌트 스캔으로 등록되지 않은 클래스에서 Autowired만 선언하면 아무런 의미가 없다. 기존의 @Bean을 이용하여 스프링빈에 등록하고 의존관계를 주입하는 것보다 훨씬 편한 방법으로 의존관계를 주입할 수 있다. 객체지향언어가 가져야할 원리다섯가지 SOLID의 D에 해당하는 DIP에 부합하는 어노테이션이다. *@Component 컴포넌트 스캔을 실행할 때 스캔 대상이다. 스프링은 @ComponentScan 어노테이션을 보면 @Component 가 붙어있는 클래스들을 쭉 돌아서 찾아내고 스프링빈으로 등록한다. 스프링 빈에 등록된 빈들..
*모든 빈 출력하기 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for(String beanDefinitionName : beanDefinitionNames){ Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); } }..
Controller : 컨트롤러를 통해서 외부 요청을 받고 Service : 서비스에서 비즈니스 로직을 만들고 Repository : 리포지토리에서 데이터를 저장하고 =정형화된 패턴 Autowired : 내가 현재 작업하는 클래스에서 다른 클래스의 객체를 사용하고 싶을 때는 현재 작업하는 클래스에서 new 하고 객체를 다른 클래스의 객체를 만드는 것이 아니라 private final 다른클래스 객체명; 이렇게 선언해 준 뒤에 @Autowired public 현재작업중인클래스(다른클래스 객체명){ this.객체명 = 객체명 } 이렇게 구현하면 된다. => 해당 방법은 Dependency Injection 즉 DI중 생성자 주입이라고 부른다. *DI란? 의존성 주입이라고 표현하고 DI에는 세가지 주입이 있다..