본문 바로가기

spring16

대체 application.properties 는 어떻게 동작되는 거지? [요약] 1. application.properties 가 인식되는 코드가 변경되었다. 2. config 의 위치에 따른 우선순위 순서가 있다. 3. springboot 는 default 가 .properties 이고, .yml 을 인식하기 위해서는 EnvironmentPostProcessor 를 알아야 한다. 의식의 흐름대로 어떻게 application.properties 를 스프링 부트가 이해할 수 있는지 알아보자. 어느 시점부터 동작 방식이 변경되었다. Spring 2.4.0 부터 application.properties 를 인식하는 것이 스프링부트 코드 내에서 변경되었음을 코드를 통해 확인할 수 있었다. 이전에는 ConfigFileApplicationListener 를 통해서 application.. 2022. 9. 3.
TestContainer의 docker-compose 활용했지만, 테스트가 통과하지 않았다면? - 활용 이전 글 - TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer 를 통해 테스트 용이성 높이기 - 입문 TestContainer TestContainers 라는 라이브러리는 테스트 코드에서 손쉽게 원하는 모듈을 테스트용도로 띄우고 내릴 수 있습니다. // add in build.gradle testImplementation 'org.testcontainers:testcontainers.. happy-coding-day.tistory.com 실제로 TestContainer 를 사용하다보면 예기치 않게 동작되는 경우가 있습니다. docker-compose 를 통해 잘되는 것을 확인하고 난 뒤, 이를 TestContainer 를 활용해 컨테이너를 띄울 경우 이슈가 발생합니.. 2022. 4. 17.
Thymeleaf CheatSheet - 2 (template layout) 공통된 영역은 따로 분리해서 개발해야 한다. 그런 부분에 대한 처리가 바로 템플릿 레이아웃이다. 3가지 방식이 있다. 1. 템플릿 조각 th:fragment 태그의 의미는 다른 곳에 포함되는 코드 조각이라 이해하면 된다. 어떻게 사용하는가? // footer.html 푸터 자리 입니다. 파라미터 자리 입니다. footer.html 에서 2개의 fragment 를 copy 와copyParam 선언했습니다. 그럼 선언한 fragment 를 사용한 부분은 다음과 같습니다. 부분 포함 부분 포함 insert 부분 포함 replace 부분 포함 단순 표현식 파라미터 사용 ~{...} 를 사용 와 같이 footer :: copy 사용 insert 와 replace 의 차이는 현재 태그가 어떻게 되는지에 대한 차이 .. 2021. 9. 6.
SpringMVC 에서 말하는 MessageConverter 코드로 이해하기 SpringMVC는 어떻게 내가 보낸 요청 메세지를 찰떡같이 알아듣고 Json 등의 내가 원하는 값으로 반환해주는걸까? HTTP 메시지 컨버터에 대해서 조금더 자세히 알아보려고 합니다. 총 2가지로 나눠서 살펴볼 예정입니다. POST 방식의 Request 보낼시, @RequestBody 가 어떻게 Converter 되는지. GET 방식으로 Request 조회시, @ResponseBody가 어떻게 Converter 되는지 확인해볼 예정입니다. MessageConverter 종류 MessageConverter 의 종류를 이해하기 위해서는 먼저 HttpMessageConverter 가 무엇인지 알아봅니다. SpringMVC 에서는 인터페이스로 존재하는데, 아래와 같습니다. package org.springfr.. 2021. 8. 15.
직접 코딩으로 느껴본 Spring Data JPA와 Spring Data JDBC 의 차이점 기존의 트랜잭션 스크립트 패턴으로 구현된 코드를 JPA로 변경해보면서 의존성을 분리하고, 다시한번 트랜잭션 스크립트 패턴으로 구현된 코드를 Spring Data JDBC (Spring JDBC와는 다른 Spring Data 에서 제공하는 라이브러리입니다.) 로 변경하면서 느꼈던 차이점에 대해서 작성할 예정입니다. Github - https://github.com/LenKIM/jwp-refactoring 트랜잭션 스크립트로 작성된 코드의 브랜치 - step1 JPA로 구현된 코드의 브랜치 - step3 Spring Data JDBC 로 구현된 코드의 브랜치 - try-spring-jdbc-step2-service Index Referance 에서 말하는 Spring Data JDBC와, JPA의 차이점 내.. 2021. 7. 18.
[2019] DDD Lite@Spring 동영상 시청 리뷰 DDD-Lite@Spring 세미나 내용이 유익하다고 판단되, 동영상을 보면서 정리한 내용입니다. 2번째 시청하면서, 정명주님이 생각하는 DDD에 대한 개념이 잘 녹아있고, 간결하게 DDD 에 대해서 설명해주셔서 정리하고자 합니다. 유지보수 사항에서 항상 개발자는 고통받습니다. 왜 그럴까요? 왜냐하면서, 애플리케이션이 엄청 복잡하기 때문입니다. 크게 2가지로 복잡합을 구분해보면 우리가 해결해야 할 문제 자체 우리가 사용하는 기술과 도구 위기가 어떻게 오는가? 빠르고 간단하게 일정 드리븐 개발을 하다보니까- 빠르고 간단하게 개발했는데, 요구사항이 변경되고 점점 복잡해지면서 빅뱅식 개편을 많이 하는데, 잘못된 레거시에 의존하기 때문에 이 순환이 반복됩니다. 원인은 빠르고 간단하게 맞지않는 접근법을 이용하다보.. 2021. 7. 18.
[우아한테크코스Pro]인수테스트 주도 개발[3/9] 인수테스트 주도 개발이란 무엇인가? 개인적인 생각으로서, 설명할 때테스트 주도 개발(TDD) 의 단점을 해소시켜주는 개발론 중 하나라고 말씀드리고 싶습니다. TDD 라는 것은 실패한 테스트케이스를 작성하고, 이를 통과시키면서 개발해나가는 방법을 말합니다. TDD 단점으로 생각해보면, 실패한 테스트라는 것을 무엇을 어디에서부터 어떻게 테스트를 해야될지? 판단하기 어렵다는 부분에 있습니다. 이런 문제를 해소시켜 주는 개발 방법론으로서 인수주도 테스트 개발 이라는 것이 나옵니다. 어떻게 이런 부분을 도와줄수 있을까요? 이부분을 학습하기 위해서 우아한테크캠프pro 에서는 3주차 과제로 인수 테스트 주도 개발을 체험해볼 수 있는 시간을 가졌습니다. 이미 어느정도 작성된 코드를 Fork 받아, 인수테스트 를 작성하.. 2021. 6. 15.
[JPA] JoinColumn vs mappedBy mappedBy 와 @JoinedColumn 에 대해서 알아보기. @Entity public class Company { ... private String name; @OneToMany(mappedBy = "company", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List branchs = new ArrayList(); ... } @Entity public class Branch { ... private String branchName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "companyId", foreignKey = @ForeignKey(.. 2021. 6. 13.
Spring Data JDBC 가볍게 살펴보기 - 1 Spring Data JPA 마찬가지로, Spring Data 라는 Prefix 가 붙습니다. 여기서 Spring Data 란 무엇일까? 간단하게 Docs 에서 말하는 컨셉을 이해해보자. Spring Data의 핵심은 Repository 이다. 이는 ID가 되는 Type과 Domain Class가 되는 Type을 Argument로 갖는다. 이 인터페이스는 주로 작업할 Type을 캡처하고 인터페이스를 확장하는 인터페이스를 발견하는 데 도움이 되는 마커 인터페이스 역할을 합니다. - docs.spring.io/spring-data/jdbc/docs/current/reference/html/#repositories.core-concepts 아마도 Spring Data 라고 하는 것들은 Repository 가 .. 2021. 5. 9.
JPA 연관 관계를 명시(사용)하는 이유는 무엇일까? 이 글을 작성하기 앞서, 절대 이 글은 JPA가 RDBS와의 패러다임 불일치를 해결하는 좋은 도구라는 것을 인지하고 있으며, 아래 글을 앞서 언급한 내용을 말하고자 작성한 것이 아니기 때문에 이 점 유의부탁드립니다. 아래 내용은 어디까지나 제 의견일 뿐이고, 맞지 않을 수도 있습니다. 스프링 부트를 활용하는 프로젝트에서 대부분 우리는 ORM으로 JPA를 사용합니다. 왜 그럴까요? 저같은 경우 인프런의 김영한님의 강의를 들으면서 JPA는 RDMS와 객체지향의 패러다임 불일치를 해결해주는 좋은 도구라는 것을 시작으로 JPA를 학습해왔습니다. 또한 개발 트랜드 라는 것이 한 몫했던건 아니였을까 싶기도 합니다. 아마도 앞서 말한 개발 트랜드는 아래와 같은 그래프를 말하는 거겠죠? 이런 행위가 혹시 귀찮다고 여기.. 2021. 1. 16.
HTTP 304 Not Modified의 이해 및 예제(with. spring) 1. HTTP 상태 코드 1.1 응답 메시지 & 상태라인 After receiving and interpreting a request message, a server responds with an HTTP response message. 요청 메시지를 받고 해석한 뒤에, 서버는 HTTP 응답 메시지를 보낸다. Example: HTTP/1.1 304 Not Modified Date: Fri, 07 Sep 2012 14:51:43 GMT Server: Apache/2.2.22 (Win32) mod_jk/1.2.37 Connection: Keep-Alive Keep-Alive: timeout=5, max=94 ETag: "d00000001f216-1e7-4c908f1fc4d6e" The first line o.. 2020. 11. 14.
4. Gradle 프로젝트에서 Swagger Codegen 적용하기. SwaggerCodeGen CLI 에 대한 설명은 이전에 했었습니다. 이제부터는 Gradle 프로젝트에 SwaggerCodegen을 적용하는 방법에 대해서 알아보겠습니다. 먼저 Gralde SwaggerCodegen Plugin 을 알아야 합니다. 저 또한 여기 나온 메뉴얼대로 진행했습니다. 당연히 우선적으로 행해져야 하는 부분은 의존성을 추가하는거겠죠? plugins { id 'org.hidetake.swagger.generator' version '2.18.2' } repositories { jcenter() } dependencies { swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.2' // Swagger Codegen V2 swaggerCodegen .. 2020. 10. 18.
LazyInitializationException 를 벗어나기 위해서는 어떻게 해야될까? JPA에서 최적의 쿼리를 보내는 방법은 무엇일까? Photo by Jan Antonin Kolar on Unsplash 들어가기 JPA의 연관관계를 사용하다 사용하지 않으니까, 금방 까먹고, 또다시 공부하는 제 모습을 보면서, 이 부분은 어느 정도 정리해야겠다는 마음으로 포스팅을 작성합니다. 이 글은 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 학습한 뒤, 일부 내용을 편집했습니다. 리뷰 전체적으로 김영한 강사님의 노하우가 '녹아내려있다' 라는 생각은 강하게 들었습니다. 당연하다고 여겨지는 부분이라도 직접 동작하는 코드로 이해하지 않는다면, 이해하지 않은 것이라고 했습니다. 그런 측면에서 이번 강의는 당연하지만 실행해보지 않았기에 몰랐던 부분을 잘 집어주는 부분이 많았습니다. LazyInitializationException 는 왜.. 2020. 10. 3.
대체 JPA에서 Proxy 로 초기화된다는 말이 뭔데? 들어가기 인프런에서 JPA관련 학습 동영상을 듣다가 LazyInitalization 의 경우, null로 Porxy가 초기화 된다는 말을 했었습니다. 그래서, 코드를 찬찬히 보니 어떤 가짜 객체를 만드는 것처럼 보였습니다. 이건 대체 무엇일까? 라는 고민으로 "다이나믹프록시" 에 대한 학습을 하게 되었습니다. 대부분의 내용은 백기선님의 더 자바, 코드를 조작하는 다양한 방법에서 발췌한 부분을 베이스로, 이를 제가 이해한 방식으로 풀어 적어내려가볼까 합니다. 스프링부트에서 디버깅을 하다 보면 자주 마주치는 이름이 바로 cglib 이라는 라이브러리입니다. 이 라이브러리는 코드를 생성해주는 것이라고 이해하고 있었고, 자세히는 몰랐었습니다. 인터넷에 검색을 해도 생각했던 것 만큼 자세히 나오지는 않았습니다. 그.. 2020. 10. 2.
자바의 리플렉션(Reflection)을 코드와 함께 이해하기 Photo by Maria Teneva on Unsplash 리플렉션 이해하기 해당 세미나는 외부교육으로 들은 더자바를 수강하고 시작하는 강의입니다. 우리의 최종 목표는 Spring에서 사용되는 DI의 동작원리를 이해하는 것입니다. 내용에 나오는 코드는 여기에서 좀 더 자세히 보실 수 있습니다. 1. 스프링의 Depedency Injection은 어떻게 동작할까? spring init 으로 프로젝트 만들기 book, bookSerivce, bookRepository 생성후 DI 하기. 2. 리플렉션 API - 클래스 정보 조회 Branch> 01-reflection-api-클래스-정보-조회 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/l.. 2020. 9. 16.
Spring PSA(Portable Service Abstraction) 란 무엇인가? "잘 만든 인터페이스 하나가 열 클래스 부럽지 않다" PSA = 잘 만든 인터페이스 Spring 에서 제공하는 대부분의 인터페이스는 PSA 입니다. PSA가 적용된 코드라면 확장성이 좋고, 기술에 특화되어 있지 않는 코드를 의미합니다. 트랜잭션(Transaction) 대표적인 예시로 @Transactional > PlatformTransactionalManager 의 인터페이스가 중요하다. PlatformTransactionalManager 의 구현체들이 바뀌더라도 그 PlatformTransactionalManager 의 코드는 변경되지 않습니다. docs.spring.io/spring-framework/docs/current/spring-framework-reference/data-access.htm.. 2020. 9. 1.