[SpringBoot] Event 사용하기
·
Java,Kotlin,SpringBoot
문제 상황예를 들어, 유저가 회원가입 완료시 쿠폰을 지급해야 하는 정책이 있다고 가정해보자@Transactional@Serviceclass UserRegisterService( private val couponService: CouponService) { fun register(email: String, password: String, name: String) { val user = User(email, password, name) /*** * 회원 가입 로직 */ couponService.issueCoupon(user.id) }}만약 회원가입까지는 성공 했는데 쿠폰 서비스에서 쿠폰을 발행하는 과정에 예외가 발생하면 어떻게..
[SpringBoot] AbstractAggregateRoot로 DomainEvent 발행하기
·
Java,Kotlin,SpringBoot
DDD에서 AggregateRoot와 Domain Event란?도메인 주도 개발(Domain-Driven Design)에는 애그리거트(Aggregate)라는 단위로 도메인을 관리한다.애그리거트는 복잡한 도메인을 관리하기 쉬운 단위로 분리한 것인데 이커머스를 예로 들면 상품이 하나의 애그리거트, 리뷰가 하나의 애그리거트가 될 수 있다.애그리거트는 다른 애그리거트에 관여하지 않고, 생성되고 변경되는 이유가 각자 다르다.AggregateRoot애그리거트는 여러 개의 모델로 이루어져 있을 수 있다. 이 때, 여러개의 모델을 한 번에 관리하는 주체를 AggregateRoot라고 한다.애그리거트의 내부를 변경하기 위해서는 오직 애그리거트 루트만 가능하며, 한 트랜잭션에서는 한 개의 애그리거트만 수정해야 한다.Dom..
[SpringBoot] @Async로 비동기 작업 처리하기
·
Java,Kotlin,SpringBoot
2년전 면접에서 @Async 어노테이션을 사용하면 스레드가 새로 생성되는지, 아니면 사용하고 있던 스레드를 계속 사용하는건지 질문을 받았던 적이 있다. 지금은 당연히 기본으로는 새로운 스레드를 생성해서 사용한다고 답변할 수 있지만, 그 당시에는 멘탈이 나가서 잘 모르겠다고 답변했다. 비동기적으로 실행하는건 아는데, 스레드에 대한 개념이 부족하고 그런것도 신경쓰지 않은채 사용해왔던 것이다. 결과는 당연히 좋지 않았다.오랜만에 스프링을 다시 하는김에, @Async를 어떻게 사용하는지, 어느 사례에서 활용하면 좋을지 정리해보았다.@Async@Async 어노테이션은 스프링에서 비동기작업을 처리하기 위해 제공해주는 메소드로, 순수 자바 코드나 다른 프레임 워크에서 사용할 수 있는 어노테이션은 아니다.@Async ..
[SpringBoot] JPA에서 Enum 값 다루기(AttributeConverter)
·
Java,Kotlin,SpringBoot
모델에 Enum값을 정의하고 싶을 때가 있다. 예를 들어 상태가 될 수도 있고, 타입일수도 있다.예를 들어, Challenge라는 Entity가 있고, status 값은 ChallengeStatus라는 Enum 타입이다.@Entity@NoArgsConstructorpublic class Challenge { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; @Column private String goal; @Column private ChallengeStatus status; public Challenge(String ..
[Java] ExecutorService와 Future
·
Java,Kotlin,SpringBoot
스레드풀자바에서는 멀티 스레드를 사용해서 여러개의 작업을 병렬로 처리할 수 있다. 만약 매우 많은 작업이 한 번에 들어온다면, 그에 맞게 스레드 를 생성하고, 메모리 사용량이 늘어나 어플리케이션 성능에 영향을 줄 수 있다.만약 미리 스레드를 여러개 만들어 놓고, 작업이 들어올때 스레드에게 하나씩 할당해준다면 스레드 생성, 메모리 비용을 줄일 수 있을것이다.자바에서는 스레드풀을 사용할 수 있도록 ExecutorService를 제공해준다.ExecutorServiceExecutorService는 직접 생성하거나, Executors 클래스의 팩토리 메서드를 사용해서 생성할 수 있다.ExecutorService executor = Executors.newFixedThreadPool(3);CachedThreadPo..
[SpringBoot] h2 테이블 이름 upper_case 해제하기
·
Java,Kotlin,SpringBoot
h2 옵션 추가h2 로 테스트 DB를 사용하면 기본으로 테이블 이름이 모두 대문자가 된다.이 옵션을 해제하려면, application.yml 의 datasource 설정에 DATABASE_TO_UPPER=false 옵션을 추가하면 된다.datasource: driver-class-name: org.h2.Driver url: jdbc:h2:~/testDB;DATABASE_TO_UPPER=false username: sa password:이렇게 설정해주면 /h2-console에 접속했을때 내가 의도한 테이블명이 되어있는 것을 확인할 수 있다.(그냥 기본값이 false이면 안되는 걸까..)참고https://stackoverflow.com/questions/17529384/h2-runscr..
[SpringBoot] MockK 사용하기
·
Java,Kotlin,SpringBoot
Spring Boot + Kotlin 조합으로 유닛 테스트 코드를 짜다 보면 repository를 어떻게 주입해줘야할지 고민이 된다. 이럴때 주로 가짜로 구현체를 만들어서 주입해주게 되는데 테스트할 클래스가 JPARepository를 바라보고 있는 경우에는 가짜 구현체에 구현해줄게 너무 많다. 그래서 여러가지 방법을 찾다가 moking 라이브러리를 사용하기로 하였는데 서치중 mockK를 어떻게 사용했는지 기록하고자 한다.MockKMockK는 Kotlin에서 Mocking해주는 라이브러리이다. baeldung에서 이렇게 소개하고 있다.kotlin은 모든 class와 method들이 기본으로 final이므로 open 키워드를 붙여주지 않으면 상속되지 않는데, 이러한 특성때문에 대부분의 mocking라이브러리..
togeepizza
'Java,Kotlin,SpringBoot' 카테고리의 글 목록