들어가기 앞서 개발 환경을 간단하게 나열해본다. Spring boot 3 + Kotlin Gradle 사용하는 AWS 서비스 정보는 아래 내용을 참고할 것 아래와 같은 질문을 받은 적이 있다. 이 정보가 있다가 사라졌는데... 없어도 잘 동작하는 이유(?)가 뭘까요? S3부터 SQS까지 여러 AWS 서비스를 사용하고 있음에도 위 정보가 없이 잘 동작했다. 불필요한 정보를 노출시키는 것보다 제거하는 것이 나을 것으로 판단해서 삭제를 했지만 삭제하면서도 어떻게 이게 동작하는지 궁금했다. 아래는 사용하고 있는 패키지 목록이다. Spring Cloud AWS를 사용하고 있는 것을 알 수 있다. // build.gradle.kts dependencyManagement { imports { mavenBom("io...
앞에서 엑셀 모듈을 사용하여 암호화하는 방법을 공유했다. 이 과정에서 해당 모듈을 빌드하여 로컬에서 테스트하고 싶다는 생각이 든다. 그 방법은 아래와 같이 공유해본다. 모듈을 빌드하기 Java + Gradle Nexus Repository를 사용 - 본 내용에서는 Nexus에 반영 전 로컬에서 테스트하는 방법을 공유할 예정 기타 gradle 정보는 아래를 참고할 것 // build.gradle plugins { id 'java-library' id 'maven-publish' id 'nebula.release' version '15.2.0' } group = 'devvkkid' java.sourceCompatibility = JavaVersion.VERSION_11 java.targetCompatibil..
엑셀 파일을 만들고 업로드/다운로드 기능을 만들었다고 가정하자. 다운로드 된 엑셀에 보안 강화를 위해 암호화를 하고 싶을 수 있다. 암호화하는 방법을 간단하게 공유해본다. 환경은 아래와 같다. 엑셀 모듈 엑셀 기능이 커스터마이징된 모듈을 별도로 개발하는 것을 가정함 Java + Gradle org.apache.poi (자세한 사항은 아래 dependencies 참고 // build.gradle dependencies { implementation 'org.jsoup:jsoup:1.15.3' implementation group: "org.apache.poi", name: "poi", version: "4.1.2" implementation group: "org.apache.poi", name: "poi-..
스프링에서 Mock을 활용한 테스트를 할 때, Mockito를 가장 많이 사용할 것이다. 그리고 검증 로직을 만들 때 호출 횟수 기준으로 테스트 코드를 짜는 경우가 있다. // when userService.create(userSignUpRequest) // then verify(userRepository, times(1)).save(any()) verify(emailSender, only()).send(any(), any()) 처음에는 2가지 모두 1회만 사용한다는 점에서 동일한 용도가 아닐까 했다. 즉 아래와 같다. // userRepository라는 Mock bean은 save를 1회만 호출한다 verify(userRepository, times(1)).save(any()) // emailSende..
⚠️ 경고 ⚠️ 본 카테고리, Dev Memo는 필자가 깊게 다루기는 귀찮지만 궁금한 것들을 체험해보고 간단하게 기록을 남기는 공간입니다. 디버깅 노트, 써드파티 라이브러리 사용기, 버전 업데이트, 어이없는 실수, 오탈자 발견 등. 각종 시덥지 않은 내용이 들어 갈 수 있다는 점 참고바랍니다. (우헤헿) open-in-view (Open-Session-In-View) // application.yml spring: jpa: open-in-view: false (출처 : 공부기록) 관례상 OSIV 라고 한다. true일 경우 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있다. Api라면 클라이언트에게 응답될 때까지, View라면 View가 렌더링될 때까지 영속성컨텍스트가 살아있다. false일 ..
. 2022.10.12, 13:56 잘못 작성된 내용이 있어서 수정했습니다. 개발환경과 요구사항 본 내용은 스프링부트 + 카프카 환경에서 아래의 의존성과 카프카 세팅을 참고하여 읽기를 권한다. 개발 도구는 맥북 + 인텔리제이이다. // build.gradle plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } dependencies { // 일부 생략 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springfr..
⚠️ 경고 ⚠️ 본 카테고리, Dev Memo는 필자가 깊게 다루기는 귀찮지만 궁금한 것들을 체험해보고 간단하게 기록을 남기는 공간입니다. 디버깅 노트, 써드파티 라이브러리 사용기, 버전 업데이트, 어이없는 실수, 오탈자 발견 등. 각종 시덥지 않은 내용이 들어 갈 수 있다는 점 참고바랍니다. (우헤헿) 상황 설명 이벤트를 수신(Consume)한 뒤 원하는 로직을 처리하던 중에 에러가 발생할 수 있다. 이후에 다시 메시지를 처리할 수 있도록 재시도를 한다. 필자의 경우 10회동안 반복해서 시도를 했는데 한번 안되는 이상 10번을 해도 같은 상황이었다. 메세지 처리를 반복을 하지 않거나 한번만 반복하도록 하고 싶다. 개발 환경은 스프링 + 코틀린이다. ListenerContainerCustomizer 단일..
. 시작하기 앞서 여기에서 진행되는 환경은 스프링부트 + 코틀린이며 아래와 같은 의존성이 추가가 되어 있다. kotlinVersion=1.7.10 springBootVersion=2.5.13 // build.gradle testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.kafka:spring-kafka-test") testImplementation("io.mockk:mockk:1.13.1") 테스트를 만들었는데 when-then 형태로 아래와 같은..
타입이나 상태를 구분하기 위해 Enum class를 사용한다. 그리고 enum값을 저장하기 위해 Enum Converter 혹은 Enumerated 어노테이션을 이용하게 된다. 이 둘의 차이는 무엇이며 어떤게 더 선호되는지 확인해보려고 한다. Enumerated 어노테이션 Enumerated 어노테이션은 원하는 필드에 추가하는 것만으로도 (DB와 같은)소스에 String값을 입력해준다. 물론 순서값을 입력해주는 Option인 ORDINAL로 입력이 가능하지만 의도치않게 enum값의 순서가 바뀌는 경우가 생기면 데이터가 꼬이기 때문에 권장하지 않는다. enum class UserType { NORMAL, ADMIN; } @Column(name = "user_type", length = 70) @Enume..
비동기 처리를 위해서 이벤트를 발행하는 방식을 선택하는 경우가 있다. 나 역시도 그랬는데 사용하다가 궁금증이 생겼다. 그냥 Async 어노테이션을 달아 놓은 것과 EventListener를 적용한 것은 어떤 차이가 있을까? 결과부터 얘기하자면 모든 Event 처리 방식은 비동기가 아니다. 그것을 확인할 수 있는 테스트를 해보았다. 해당 테스트는 정아마추어님 블로그를 상당히 많이 참고했다. 테스트 전 준비 먼저 Event 모델을 만들었다. EventListener를 그냥 사용했을 때와 Asnyc 어노테이션과 함께 사용했을 때를 구분하기 위한 모델을 각각 만들었다. data class SampleEvent( val name: String, val email: String ) // 비동기용 data class..
Comment