토비의 스프링을 따라하며 스프링 부트를 직접 구현해 보겠습니다.우선 프로젝트 세팅부터 해보겠습니다.JDK : 11Java : 11Pakaging : Jar라이브러리 : Web스프링 부트 버전 : 2.7.12개발툴 : 인텔리제이 얼티밋다음 블로그부터 시작해 보겠습니다!
여기서 @SpringBootApplication를 지루고메인 메소드 안에 SpringApplication.run(HellobootApplication.class, args);를 지워 스프링 설정을 지워보겠습니다.우선 복잡한것 빼고 빈 서블릿 컨테이너부터 띄워보겠습니다서
공통로직을 FrontController(서블릿 역할)로 처리하고 하나의 서블릿으로 Cilent와 소통요청을 FrontController에서 전부 받기때문에 맨 앞에서 공통로직(인증, 중복코드, 보안)등을 처리하고맨 뒤에서 공통로직을 다듬어 반환합니다.스프링에서는 Dis
앞에서는 서블릿 컨테이너에 직접 hello라는 서블릿 객체를 넣어서 로직을처리했습니다. 이번에는 Spring Container를 Spring Container에 HelloController를 주입하고,주입된 HelloController를 주입받아 사용해 보겠습니다.서블
기존에 만들어둔 SimpleHelloService에서 다른 비지니스 로직이 추가된다면 HelloController의 코드를 수정해야 합니다.하지만 이것은 매우 좋지 않는 방법입니다.수정사항이 생기면 어떤 오류가 발생할지 모르고, 유지보수하는데 시간을 빼앗기기 때문입니다
서블릿 컨테이너(FrontController)를 직접 구현하면 URI 맵핑, 보안, 다국어, 바인딩 기능 을 개발자가 계속 처리해 주어야 합니다.이것을 간편화 하기위해 스프링의 DispatcherServlet으로 전환해 보겠습니다.이제 프론트컨트롤러 패턴을 직접 구현한
지금까지는 크게 2파트로 구분되어있습니다.1\. 스프링 컨테이너 초기화 - 생성,설정2\. 서블릿 컨테이너 초기화 - 서블릿 컨테이너 생성 후 DispatcherServlet 등록스프링부트가 이렇게 구현되어있기 때문입니다.이제 2파트를 1파트로 만들어 보겠습니다.즉,
스프링 컨테이너를 사용하기 위해 스프링 컨테이너가 사용하는 구성정보 (클래스) 를 제공해야합니다.즉, 우리가 만든 코드를 어떻게 Object로 만들어서 스프링 컨테이너에 컴포넌트로 등록해 두고스프링 컨테이너안에 Bean(Object)이 또다른 Bean(Object)를
펙토리 메소드를 만들어서 직접 스프링 컨테이너에 Bean을 등록하는 것보다 간편하게 Bean을 등록하는 방법이 있습니다.@Component어노테이션을 이용해서 간편하게 등록 할 수 있습니다.@Controller, @RestController, @Service, @Rep
ServletFactory(톰캣)와 DispatcherServlet도 스프링 컨테이너에 등록하여 사용해보겠습니다.이렇게 하면 나중에 유연한 구성이 가능해 집니다.팩토리 메소드를 사용할 것입니다.주석에도 설명했듯이 스프링 컨테이너가이 알아서 DispatcherServle
이제 메인메서드를 정리해 보겠습니다.최대한 스프링부트와 비슷하게 만들어 보겠습니다.Main 메소드에서 기능을 추출하여 메소드로 뽑아냈습니다.메소드를 재사용하기위해 클래스명과 args를 파라미터로 넘기고 run()에서는Class<?> applicationClass,
업로드중..ResponseEntity는 웹응답의 모든 요소를 가지고 있습니다. \- 헤더, 바디 등등컨트롤러 테스트 할때 중요한 것은 상태코드, 컨텐츠 타입, 바디값 입니다.문자열은 기본적으로 null과 공백을 테스트해야 합니다.
DI를 사용해서 어떤 기능을 추가할때, 기존 오브젝트를 수정하지 않고 Decorator클래스를 추가해서 동적으로 새로운 기능을 추가할 수 있습니다.Decorator패턴을 추가한다면 아래와 같은 구조를 갖게 됩니다.즉, 기능 앞에 Decorator오브젝트가 기능을 추가해
여태까지 공부했던 내용을 정리해보겠습니다. 경험상 공부를위해 복습없이 앞으로만 가다보면 항상 공부하는 목적이 무엇인지 까먹고 길을 잃었기 때문입니다. 이번에 토비의 스프링을 공부하면서 배우고자 하는것은 스프링의 원리를 알고 배우면서 객체지향 설계와 유지보수에 좋은 코드
@AutoConfiguration를 잘 이해하려면 스프링 부트가 애노테이션을 활용할때 사용하는 기법을 잘 이해하고,코드도 살펴보고, 응용하는 방법을 잘 알아야 합니다.meta-annotation 은 다른 annation 에서도 사용되는 annotation 의 경우를 말
애노테이션을 합쳐놓은 것입니다.하지만 합쳐놓는것을 나열하다보면 코드가 지져분해집니다.이때 애노테이션을 합성해서 만들 수 있습니다.ex) @RestController현재 메인메소드에는 2개의 어노테이션을 합성하여 한개로 만들어 보겠습니다.이유는 코드가 더 깔끔해지기 때문
이전 글에서 살펴보았듯이, 빈 구성정보를 분리하여 관리해 보겠습니다.우선 사용자 구성정보 Bean들은 ComponentScan을 통해 등록이 되고 있습니다.하지만, 자동 구성정보까지 ComponentScan이 Bean으로 등록하고 있습니다.이제 자동구성정보를 Compo
중요한것은 사용자 3. 챕터인 구성정보, 자동 구성정보의 의미를 알아야 합니다!지금까지 만들었던 Bean의 종류입니다.사진상에서오른쪽에 있는 Bean들은 서블릿 컨테이너를 지원하기 위한 Bean들입니다.왼쪽에 있는 Bean들은 애플리케이션 작동에 필요한 Bean들입니다
지금은 @EnableMyAutoConfiguration 에 자동 구성정보가 하드코딩 되어있습니다.이것을 동적으로 할당 할 수 있게 변경하겠습니다.하드코딩은 강한 결합이기때문에 유지보수에 좋지 못하기 때문입니다.selectImports() 메소드를 통해 메소드의 이름을
학습테스트를 해보겠습니다.남이 만들 코드의 동작방식을 이해하기 위해 테스트를 작성하는것을 말합니다.기술을 정확하게 익히기 위해 사용합니다Configuration클래스는 Bean메소드를 많이 가지고 있다는 것입니다.팩토리 메서드의 기능을 생각하면 됩니다.하지만 이것이 생
스프링 부트에서 조건(Condition)에 따라 Tomcat을사용할지, Jetty를 사용할지 결정하는 방법을 알아보겠습니다.우선 build.gradle에 jetty를 추가해 줍니다.Tomcat이 없는것 같지만, Tomcat은 starter-web에 들어있습니다.조건에
스프링은 어떤 라이브러리, 클래스가 이 프로젝트에 포함되어있는가? 를 기준으로 자동 구성을 설정합니다.어떤 라이브러리, 클래스가 이 프로젝트에 포함되어있는지를 확인하는 방법은 너무 복잡하기에 스프링에서 유틸리티를 지원합니다.ClassUtils를 사용하면 됩니다.valu
개발을 하다보면 분명 개발자가 직접 ~ 할때가 있습니다.그럴때는 자동 구성정보보다 우선하게 Bean을 등록할 수 있습니다.@ConditionalOnMissingBean을 사용하면 됩니다.@ConditionalOnMissingBean : 같은 타입의 Bean이 없다면 생
앞서 자동구성정보가 설정되는 방식을 공부해 보았습니다.자동 구성 정보는 스프링 부트가 개발자가 편리하게 개발을 하라고 설정해 주는 것입니다.이때 개발자는 커스텀 @Bean을 설정하여 자동 설정 구성을 선택할 수 있다는 것을 배웠습니다. 외부 설정 정보(.Properti
지난 시간에는 자동 구성 정보에 Environment 값을 지정하는 방법을 사용했습니다.이번에는 @Value를 통해 빈 클래스에 필드를 만들어 환경정보를 저장해 보겠습니다.@Value("${contextPath}") 처럼 사용하면 됩니다.PropertySourcesPl
개발을 하다보면 재사용 해야하는 프로퍼티도 생길 수 있습니다.필드에 지정하면 재사용 하기 힘들어 집니다.그래서 프로퍼티의 값을 별도의 클래스로 추출해 보겠습니다.우선 프로퍼티를 하나 더 추가해 보겠습니다.가장 많이 사용하는 Port를 넣겠습니다.자세히 보면 @Value
이제 애플리케이션에서 직접 이용하는것 들을 만들어 보겠습니다. JDBC를 활용할 것입니다.DataSorce : DB와 연결하기 위한 인터페이스입니다.SimpleDriverDataSource : DataSource의 구현체입니다.HiKariDataSource : Data
DataSourceConfig 자동구성 클래스와 빈을 만들어 보겠습니다.어떤 클래스가 존재할때만 Bean으로 등록할 것이기 때문에 @ConditionalMyOnClass를 사용하였습니다.따라서 hikariDataSource가 있다면 사용하고 없다면 @Conditiona
JDBC템플릿 JDBC트랜잭션 매니저를 DataSource에 등록해보겠습니다.두개의 빈은 DataSource빈에 의존해야합니다.또한, DataSource구성정보가 한개만 등록되었을때 동작해야합니다.JDBC템플릿 : SQL쿼리를 자바 코드로 DB에 전송해줌 JDBC트랜잭
Hello Repositoty를 만들어 JDBC를 사용해 DB에 값을 넣어보고 테스트까지 해보겠습니다.간단하게 3개의 기능을 하는 조회를 만들어 보겠습니다.countOf는 디폴트 메서드입니다!findHello : 이름을 기준으로 조회increaseCount : 객체의
기존에 있던 간단한 Service를 Repository를 사용하게 리펙토링 해보겠습니다.서비스가 구현해야하 메소드들을 정의해 두었습니다.SimpleHelloService는 HelloReposity를 주입받아 의존합니다.매번 Test를 할때마다 @BeforeEach로 테