본문 바로가기

SpringBoot8

영속성 처리하는 Method에 @transactional는 항상 붙이는게 맞을까? 문제 오늘 회사에서 특정 기능을 배포하자마자 문제가 발생했다. 핀포인트에서 발생하고 스택 트레이스는 다음과 같았다. > lazyinitializationexception could not initialize proxy Spring Boot, JPA 활용하는 개발자에게는 흔히 발생되는 예외중 하나이다. 이 예외가 발생하게된 이유는 무엇일까? 코드를 통해 이해해보자. @Entity public class Order { private long id; @OneToMany(mappedBy = "order", fetch = FetchType.LAZY) private List orderItems; } public interface OrderRepository extends JpaRepository { } @Servi.. 2024. 4. 20.
왜 서비스로더(ServiceLoader)를 알아야 하는가? java docs 에서 Service Loader 를 다음과 같은 한줄로 정의한다. A facility to load implementations of a service. 서비스 구현을 로드하는 기능입니다. 서비스 구현을 로드하는 기능이 왜 필요한지 부터 이해할 필요가 있을 것 같다. (여기서 서비스 구현의 의미는 비지니스 로직이 담겨진 구체적 클래스를 의미한다.) 우리가 라면을 만드는 코딩을 한다고 가정해보자. public class 신라면제조 { public void make() { pourWater(); boilWater(); putNoodle(); boilNoodle(); putSoup(); putVegetable(); } public static void main(String[] args) { .. 2024. 3. 21.
대체 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.
Springboot 에서 react.js 연동시 모든 view 맵핑을 index.html으로 forwarding 하는 방법은? [문제] SpringBoot 에서 thymeleaf 대신, React.js 를 ViewTemplate 로 사용하려 한다. 기존의 thymeleaf 는 html 별로 View을 맵핑하고 있었기 때문에, 하나의 html 에서 URL에 따른 여러 화면으로 라우팅되는 SPA Application 에서는 ViewName 맵핑이 정상적으로 동작되지 않는다. ( 참고자료 ) 예를 들어, product/list 라는 View 이름으로 맵핑을 시도한다고 가정해본다면, 프로젝트에서는 /WEB-INF/templates/product/list.html 와 같은 형태로 ViewTemplate 을 맵핑하기 위한 html 이 존재해야 합니다.(꼭, html 일 필요는 없음) 그러므로, 하나의 html 에서 원하는 URL로 라우팅시.. 2022. 4. 26.
Layered Architecture 의 단점이 무엇이라고 생각하는가? 두번째 이야기 첫번째 이야기 ( https://happy-coding-day.tistory.com/189 ) Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture.. happy-coding-day.tistory.com 요즘에는 만들면서 배우는 클린 아키텍쳐라는 책을 읽고 있습니다. 이 책에서는 Layered Architecture 에 대한 단점을 언급하는 부분이 있어, 이 부분 또한 2탄으로 정리할 필요가 있겠다 라는 생각을 가졌습니다. 첫번째 이야기는 20.. 2022. 4. 13.
gradle 기반의 여러 모듈에서 공통으로 쓰인 스크립트가 있다면? 멀티 모듈 시스템에서 공통으로 쓰인 Gradle Script 가 있다면 어떻게 해야 될까? RootProject | | - SubProjectA | -- build.gradle | - SubProjectB | -- build.gradle | - SubProjectC | -- build.gradle | - build.gradle 여기서 `SubProjectA` , `SubProjectB`, `SubProjectC` 가 build.gradle 에서 공통으로 사용되는 내용이 있다고 가정하자. 약 모듈이 5개정도 만들어지면서 반복되어지는 스크립트를 발견되었고, 코드 복사/붙여넣기가 불편하다고 느꼈다. 어떻게 해야될까? `base.gradle` 을 하나 만들어 전체 프로젝트에 공유하면 되지 않을까? 걱정되는 마음.. 2022. 2. 6.
AWS Simple Queue Service(SQS) 예제 코드로 다가가기 - #2 이전 글 - AWS Simple Queue Service(SQS) 이론적으로 다가가기 - #1 이번에는 예제코드로 SQS 를 사용하는 방법에 대해서 알아보려고 합니다. 만약에 SQS 를 스프링부트에서 사용한다는 가정하에 2가지 예제를 남겨드릴려고 합니다. 순수한 AWS-SDK 를 사용한 SQS 예제코드 awspring 에서 제공하는 SQS 예제 코드 1. 순수한 AWS-SDK 를 사용한 SQS 예제코드 공식문서 예제코드 자세한 내용은 공식문서에 잘나와있어 해당 내용을 참조하면 된다. 간단하게 몇개만 공유해보면 아래와 같습니다. @GetMapping(value = "/getQueueUrls") public ResponseEntity getQueueUrls() { ListQueuesRequest build .. 2021. 11. 20.
build.gradle 에서 다양한 방식으로 변수 사용하기. 들어가기 다양한 방법들 build.gradle 에서 변수를 사용하는 방식은 아래와 같습니다. 사실 위 System.xxx 의 경우 gradle에서 제공하기 보다는 Java에서 제공한다는 말이 맞습니다. 그러나 제목과 같이 build.gradle 에서 사용하는 방법이므로, 포함시키겠습니다. task printTask(){ println(System.getenv("X_USER")) println(project.getProperties()["X_USER"]) println(System.getProperty("X_USER")) } > "xxx" ./gradlew printTask "xxx" 여기서 xxx 하는 것에 따라서 변수를 다르게 넣을 수 있습니다. System.getenv("X-USER") // 시스템의.. 2020. 9. 4.