Spring Framework 39

Chapter 08. 외부 설정을 이용한 자동 구성

Environment 추상화와 프로퍼티 지금까지 자동구성에 대한 과정을 살펴봤다. 자동 구성에 의해 만들어지는 빈 오브젝트에는 보통 기본값이 들어가있다. ex) port: 8080 cf) Environment 인터페이스 스프링 애플리케이션의 환경 설정과 관련된 정보를 제공한다. 프로퍼티 값을 가져오거나 환경 변수 값을 조회하는 메서드를 제공한다. getProperty() 스프링은 단일화된 방식으로 접근할 수 있도록 설계되어있다. 1) standardEnviroment System propertyies System Enviroment Variables 2) standardServletEnvironment: 웹 환경일 때 사용 가능 ServletConfig Parameters servletcontext Pa..

Chapter 07. 조건부 자동 구성

@ConditionalOnMissingBean 스타터와 Jetty 서버 구성 추가 Jetty를 서블릿 컨테이너로 사용해보자. 조건부 자동 구성: configuration 클래스에 infra structure 역할을 하는 빈의 구성 정보를 담아서 기술 종류별로 잘게 쪼개어 여러 개의 클래스를 만들어 놓고 외부 설정 파일에 이 목록을 나열하고 파일을 읽어서 해당하는 configuration 클래스를 부트가 시작할 때 빈으로 등록한다. 자동 구성 configuration 클래스들이 스프링 컨테이너에 들어있다. 스프링 부트에 내장된 @AutoConfiguration 애너테이션은 상위에 @Configuration이 있다. 다음과 같이 파일을 살펴 보면 144개의 파일 위치 정보가 들어있다. 부트가 켜지면 144개..

Chapter 06. 메타 애너테이션과 합성 애너테이션

메타 애너테이션 메타 애너테이션이란? 메타 애너테이션: 애너테이션을 위한 애너테이션을 말한다. ex) @Component @Service, @Controller 를 타고 들어가면 상위에 @Component가 붙어있는 걸 알 수 있다. 메타 애너테이션이 불은 클래스를 사용하면 기능적으로는 차이가 없다. 그런데, @Service / @Controller와 같이 다른 이름을 붙이는 것은 WebMvc 에서 컨트롤러 / 서비스 어느 역할인지를 명확히 할 수 있다. 메타 애너테이션에는 상속 개념이 없다. 에너테이션에는 @Retention(RetentionPolicy.RUNTIME), @Target 을 줘야한다. @Retention(RetentionPolicy)의 디폴트 값은 RetentionPolicy.CLASS ..

Chapter 05. DI와 테스트, 디자인 패턴

테스트 코드를 이용한 테스트 서버를 띄우고 http 요청과 응답을 확인할 수 있다. 그런데 매번 직접 확인하는 것은 번거로운 일이다. ex) 헤더, 바디 등 테스트 코드를 사용하면 효율적이다. Spring initializer를 통해 애플리케이션을 처음 세팅하면 "test" 폴더 안에 TestClass 가 생성된다. 애플리케이션이 기본적으로 스프링 부트를 기반으로 작동한다. API 요청 라이브러리 RestTemplate vs TestTemplate RestTemplate: 정상이 아닌 경우, 예외를 던진다. TestRestTemplate: 응답 자체를 그대로 가져오기 때문에 에러가 난 경우 사용할 때 적합하다. status code, content-type 이 뭔지 파악할 수 있어 편리하다. Assert..

Chapter 04. 독립 실행형 스프링 애플리케이션

스프링 컨테이너 사용 지난 시간까지는 독립 실행이 가능한 서블릿 애플리케이션을 만들었다. 그러면 독립 실행형 스프링 애플리케이션은 어떻게 만들 수 있을까? 1) POJO(Plain Old Java Object): 비지니스 로직을 담은 Java 오브젝트 (상속 X, ) 2) 구성 정보를 담은 Configuration 메타 데이터 에러가 나지 않는한 서블릿 컨테이너가 기본적으로 Http response 200을 세팅해서 넣어준다. (생략 가능) Ex) GenericApplicationContext applicationContext = new GenericApplicationContext(); applicationContext.registerBean(HelloController.class); applicati..

Chapter 03. 독립 실행형 서블릿 애플리케이션

Containerless 개발 준비 컨테이너 리스 방식은 서블릿 컨테이너와 관련된 번거롭고 복잡한 작업들에 대해 개발자가 더이상 신경쓰지 않도록 스프링 컨테이너에 올라가는 빈에만 집중할 수 있도록 해준다. main() 메서드 하나만 실행시켰는데 Tomcat(Java의 서블릿 컨테이너)이 뜨고 스프링 컨테이너도 뜬다. 애플리케이션을 동작시킨다. 그런데 만약, Spring Boot가 없다면? 서블릿 컨테이너 띄우기 서블릿 컨테이너(Servlet container)란? 자바의 표준 기술인 servlet에 대해 서블릿을 구현한 컨테이너를 말하며 종류가 다양하다. ex) Tomcat springio를 통해 스프링 프로젝트를 셋업하면 자동으로 내장형 톰캣(embedded tomcat)이라는 라이브러리가 제공된다. ..

Chapter 02. 스프링 부트 시작하기

스프링 부트 개발 환경 스프링 부트 2.7.6 JDK 8/11/17 설치 Java 11 Gragle - groovy Spring Boot 2.7.6 group: tobyspring artifact: helloboot jar Hello API 테스트 http request를 생성하고 http response를 확인한다. 웹 브라우저 개발자 도구 curl intelliJ ultimate http request Postman API platform: JUnit test HTTPie content HTTP 요청과 응답 웹 애플리케이션의 동작 구조: 웹 클라이언트가 요청을 보낸다. 웹 컨테이너는 해당 요청을 처리할 컴포넌트를 찾아서 요청을 위임한다. 컴포넌트는 요청을 분석하고 처리한다. 결과로 만들어진 응답이 클..

Chapter 01. 스프링 부트 살펴보기

스프링 부트(Spring Boot)란? 스프링 부트는 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립 실행형 애플리케이션을 복잡한 고민없이 빠르게 작성할 수 있게 도와주는 여러가지 도구 모음이다. 알아서 결정해준다. 스프링과 스프링 부트는 다르다. 애플리케이션을 만들 수 있도록 도와주는 기술이다. 예전의 엔터프라이즈 애플리케이션은 web appliction archive 라는 와? 파일 같은 형태로 패키징해서 서버에 배포한다. 그 위에서 동작시키는 방식으로 사용했다. 그런데 스프링 부트는 .java, .jar? 를 이용해서 애플리케이션 전체를 바로 실행 가능하다. 스프링 부트(Spring Boot) 목표 빠르고 광범위한 영역의 스프링 개발 경험을 제공한다. 강한 주장을 가지고 즉시 적용 가능한 기..

Chapter 06. Spring Data JPA가 지원하는 querydsl 기능

인터페이스 지원- QuerydslPredicateExecutor 앞으로 살펴볼 Spring Data가 제공하는 기능은 제약이 커서 복잡한 실무환경에서 사용하기에는 부족하다. 어떤 한계점이 있을까? Ex) 리포지토리에 적용 Repo QuerydslPredicateExecutor public interface UserRepository extends JpaRepository, QuerydslPredicateExecutor { } Iterable result = userRepository.findAll( member.age.between(10, 40).and(member.username.eq("member1"))); Note) 한계점 묵시적 조인은 가능하나 leftjoin은 불가능하다. 클라이언트가 Query..

Chapter 05. 실무 활용 - 스프링 데이터 JPA와 Querydsl

Spring Data JPA repository 로 변경 Repository @Repository public interface MemberRepository extends JpaRepository { List findByUsername(String username); } test querydsl의 전용 기능인 search를 작성할 수 없다. 따라서 사용자 정의 리포지토리가 필요하다. @Test public void basicTest(){ Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberRepository.findById(member.getId()).get(); assertT..