728x90

분류 전체보기 173

Redisson 으로 분산 Lock 구현하기

회사 프로젝트를 진행하던 동시성 문제를 해결하기 위해 분산락이 필요할 것 같다는 판단이 들었습니다. 분산락이란 무엇일까요? 아주 가볍게 설명하자면 예를 들어, 가게는 하나의 주문만 받을 수 있는데 A 손님과 B 손님이 0.0001 초차이로 주문을 한다고 해봅시다. 근데 가게에 있는 주문 기계는 주문이 들어오면 이미 주문을 받았는지를 체크하고 주문 수락을 누르는 프로세스라고 해봅시다. 하지만 주문을 받았는지 체크하기 위해서는 대략 0.1 초정도의 시간이 필요합니다. 그래서 가계기계는 A 손님의 주문과 B 손님의 주문간의 간격이 0.0001 초 밖에 되지 않아서 A 주문과 B 주문을 동시에 받게되는 상황이 발생합니다. 만약 지금과 같은 상황이면 주문을 받는 순간 뭔가 Lock 을 걸어 제어가 가능할 것 입니..

Spring 2022.02.10

[StackOverflow] 왜 자식생성자에서 super() 를 써야 하는가?

최근에 영어 공부도 할겸 StackOverflow 활동을 이틀에 하나정도는 답변을 다는 식으로 활동해보려고 한다. 일단 질문은 아래내용이다. https://stackoverflow.com/questions/70973089/using-super-in-child-constructor Is it unnecessary to put super() in constructor? Isn't this one automatically put by the compiler if I don't put it in a subclass's constructor? That means I don't even need to care about it? In some articles they put it out. And if I've got..

Java 2022.02.03

[Spring Batch] Data 를 CSV 파일로 만들기

회사에서 Spring Batch 를 통해서 DB Column 들을 CSV 로 전환해서 뽑을 필요가 있었다. 일단 간단하게 DB 에서 값을 읽어와서 CSV 로 만드는 작업을 해보자. @Entity @Table(name = "user") class User( name: String, email: String ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null @Column(name = "name", length = 20) var name: String = name @Column(name = "email", length = 30) var email: String = email override fun toString()..

Spring 2022.01.23

Ko-Test Framework 사용해보기

코틀린 하면서 처음에는 잘 이해하지 못했던 DSL 문법의 간결함을 알게 되면서 infix 로 연계하여 만들 수 있는 DSL 구조가 좋은 것 같다는 생각이 들었다. 예를 들면 원래 Java + QueryDSL 을 사용한다면 아래와 같은 코드가 작성될 수 있을 것이다. selectFrom(person).where(person.name.eq("roach)) 하지만 코틀린의 infix 를 이용한다면 다르게 풀어볼 수도 있을 것이다. selectFrom person where person.name is "roach" 내 생각엔 Kotlin 에서 QueryDSL 을 쓰는건 계속해서 JPA + QueryDSL 을 써왔기때문이라고 생각하는데 Kotlin + Spring + JPA 를 이용한다면 QueryDSL 보다 i..

Kotlin 2022.01.21

Web 계층에 Port 를 통해 더 자유로운 코드 짜기

아래 코드를 한번 보자. Cotroller 에서 Service 계층을 바로 참조하고 있다. 이건 보통 일반적인 비즈니스 로직을 작성할때 많이 작성되는 코드이다. @RestController class UserJoinController( private val userJoinService: UserJoinService ) { @GetMapping("/users") fun hello() { userJoinService.join() } } 이건 보통 일반적인 코드인데 한가지 문제점이라면 문제점이 있을 수 있다. 만약 User 가 회원가입하는 부분이 MSA 환경으로 분리된다면 어떻게 대응할 수 있을까? 아마도, 기존의 UserService 를 지워야 하거나 수정하는 현상이 발생할 것이다. 우리가 클린코드 / 클린..

Architecture 2022.01.20

Kotlin 에서 Null 을 다루기

이 예제는 코틀린 쿡북을 읽고 정리한 내용입니다. 아래와 같은 클래스가 하나 존재한다고 해보자. class Person( val first: String, val middle: String?, val last: String, ) 코틀린에는 Nullable(null 을 허용) 이라는 개념이 존재한다. 왜 이런 개념이 필요하지? 라는 의문을 가질 수 있는 사람이 분명 있을 것이기에 간단하게 짚고 넘어가려고 한다. Nullable 을 도입하는 이유는 Null 로 부터 더 안전해지기 위해서이다. 예를 들어 A 라는 변수에 Null 이 대입될 수 있다고 해보자. 자바같은 경우에는 A 라는 변수에 Null 이 들어갈 수 있다는 것을 런타임에 되서야 알 수 있을 것이다. 그렇게 되면 우리는 NullPointerExc..

Kotlin 2022.01.18

2021 늦은 회고

2021 년도가 지나도 2022년이 오면서 개발인생의 첫 시작인 2021년도에 대한 회고록을 남겨볼까 한다. 2021 년도의 여러 사건들 중 나를 이끌어줬던 사건들과 여러가지 일들을 기반으로 회고록을 작성해보려고 한다. 여러 사람들의 블로그의 회고록을 보니 이벤트 기반으로 참 길게쓰는게 오랜 기억에 남는거 같다는 생각이 들었다. 그래서 블로그 글이 다소 길 수 있다. 졸업 대학교 졸업은 2021 년도 2월에 졸업했다. 팬데믹 시대라 졸업 사진 요런것도 찍지 않았고, 그냥 수료증만 개인별로 받아가는 형태로 진행했다. 졸업은 나에겐 큰 이벤트는 아니지만, 인생의 이력서에 계속해서 따라올 하나의 사건 중 하나이고 이제 무언가 날 잡아주는게 없는 상태로 시장에 내놓인 상태로 만들어 주기도 했다. 코드스쿼드 시장..

일일회고 2022.01.17

[Spring] MultiModule 의존성 순서 설정으로 인한 오류

이번에 Spring MultiModule 을 진행하면서 계속해서 Jpa 설정에 관한 오류를 먹고 있었다. 아무리 application.yml 에 설정을 해도 설정이 안먹는 오류가 있었는데 위와 같이 설정을 해줘도 DataSource URL 이 없다고 나온다. 일단 멀티모듈 구조의 패키지를 한번 살펴보도록 하자. 일단 Api 는 Web 계층으로 쉽게 말하면 Controller 계층에 가깝고 Service 와 Entity 는 이름 그대로 Entity(Persistence 계층) , Service(Domain Layer) 라고 생각하면 편하다. 문제는 Service 에서도 Transactional 을 사용해야 해서 JPA 설정을 가지고 있어서 처음에는 아 Service Module 에도 entity 의 app..

Spring 2022.01.17

멀티 모듈 Project 에서 Bean 이 Resolve 되지 않을때 해결

A Module 에서 B Module 의 빈이 Resolve 안되는 경우 현재 내 디렉토리 구조는 아래와 같다. 여기서 Service 에서 Entity 즉 PersistenceLayer 에 대한 Dependency 를 주입받아야 했다. 그런데 Service 계층에서는 Entity 계층에 대한 Bean 의존성을 해석하지 못하고 있었다. 아래 사진처럼. 이유는 무엇일까? 바로 Service 계층에 Bean 을 Resolve 하는 과정에서 스캔대상에 Entity Module 이 포함되어 있지 않기 때문이다. 따라서 우리는 ComponentScan 의 basePackage 에 entity Module 도 추가해주어야 한다. 느낀점 멀티 모듈 Project 를 하면서 Spring 에 대한 지식이 생각보다 높지 않..

Spring 2022.01.15

[Intellij] Save Actions 를 이용한 자동 포맷팅

코드를 작성하다 보면 포맷팅의 일관성이 무너지고는 합니다. 그래서 JavaScript 에서는 Prettier 를 통해서 Indent 나 Tab Size 를 맞추는데요. Intellij 에서는 Java 에서 자동 포맷팅을 편하게 이용하는 방법이 있습니다. 일단 Preference(설정) - Plugin 에서 Save Actions 를 설치해줍니다. 일단 이 플러그인은 간단하게 설명해서 저장 키 (cmd + s 또는 ctrl + s ) 키를 눌렀을때 특정 액션을 트리거 해주는 플러그인 입니다. 우리는 이 트리거에 저장키를 누르면 코드를 다시 재 배열 해주는 기능을 이용할 것입니다. 만약 설치가 된다면 Intellij 를 다시 재시작 해주시길 바랍니다. 이제 저장했을때 코드를 재배열해주는 기능을 장착하기 위해..

Java 2022.01.08
728x90