분류 전체보기 364

ATDD 이해해보기!

최근 TDD에 큰 관심이 생겨서 요즘 핫하다는 ATDD에 대해서와 TDD에 대해 더 깊게 이해하려고 했다. 강연을 찾던 중 NEXTSTEP에 ATDD, 클린 코드 with Spring이라는 좋은 강의 코스가 있는데, 가격이 80만원이다... ㄷㄷ https://edu.nextstep.camp/c/R89PYi5H/ 사실 조금 부담스러워서 우아한 ATDD라는 우아한 테크 세미나 발표가 있다. 아래는 해당 발표 내용을 공부하며 정리한 것이다..! 사실 메모에 가깝다. 인수 테스트 인수 테스트는 시나리오(사용자 스토리) 기반으로 기능을 테스트하는 것이다. 이러한 인수 테스트는 아래의 장점이 있다. 배포 없이 빠른 피드백을 받을 수 있다. 도메인과 서비스 파악에 큰 도움이 된다. QA 절차 없이 테스트 코드만으로..

Server/JUnit, Spock 2023.05.17

우아한 스프링 배치 강연내용 정리 (+ 통합 테스트 SpringTestContext Caching 팁!)

배달의 민족의 주문, 포인트, 정산 시스템에서 향로님께서 적용하면서 얻은 팁을 아래 강연에서 발표했다. https://www.youtube.com/watch?v=_nkJkWVH-mo Web vs Batch Web 실시간 처리를 위주로 한다. 상대적인 처리 속도를 가진다. QA가 용이하다. Batch 후속 처리를 위주로 한다. 절대적인 처리 속도가 측정된다. QA가 복잡하다. (DB나 자바 코드를 까봐야, 문제를 찾을 수 있기 때문) 철저한 테스트 코드가 반드시 필요하다. 배치 애플리케이션이 필요한 근거 아래의 경우에는 필수적으로 배치 애플리케이션이 필요할 수 있다. 일정 주기로 실행되어야 할 때 실시간 처리가 어려운 대량의 데이터를 처리할 때 배민에서는 매출의 경우 5억건 정도가 있고, 매출 상세의 경우..

Server/Spring batch 2023.05.02

토스 뱅크의 성능과 정합성을 동시에 충족하기!

해당 포스팅에서는 아래 강연의 내용을 참고해서 작성합니다. 참고: https://www.youtube.com/watch?v=v9rcKpUZw4o&t=928s 채널계와 계정계 왜 은행에서는 1개월, 3개월, 6개월 등 기간에 따른 입금+출금 내역을 조회할 수는 있지만, 무한 스크롤 UI를 제공하지 않을까? 일반적으로 은행 시스템은 아래 구조로 분리되어 있다. 계정계 - 실제로 유저의 돈을 다루며, 원본 데이터가 저장됨 (아주 높은 신뢰도 요구) 채널계 - 유저의 요청을 직접 받아 계정계로 전달 예로 토스 뱅크에서는 채널계는 여러개의 서버와 여러개의 DB로 분리되어 있다. 서버의 Scaleout이 용이하고, DB 부하가 커지면 DB를 분리하기 쉽다. 트랜잭션 처리가 불편하다. 반면 계정계의 경우 아주 높은 ..

Spring Batch - 기본 주요 도메인 이해하기!

Job Job은 배치 계층에서 가장 상위에 있는 개념으로 하나의 작업 자체를 의미한다. Job Configuration을 통해 생성되고 하나의 작업을 어떻게 구성하고 실행할 것인지 전체적으로 명세한다. 여러 개의 Step으로 구성되기 때문에 최소한 1개 이상의 Step을 구성해야 한다. Job의 경우 빈으로 등록한 후 수동으로 실행시킬 수도 있고, SpringBoot의 BatchAutoConfiguration에서 기본으로 빈으로 등록한 Job을 수행한다. Job 구현체 Job 구현체는 크게 두 가지로 나뉜다. SimpleJob 순차적으로 Step을 실행시키는 Job 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있다. FlowJob 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 ..

Server/Spring batch 2023.04.24

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!)

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!) 아래의 에러가 뜨면서 커넥션 연결이 실패하는 이슈가 발생했다. the last packet successfully received from the server was 30,035 milliseconds ago. 조금더 로그를 올라가보니 이런 경고가 뜨고있었다. 아래와 같이 각 커넥션으로 연결을 시도하다가 모두 실패했다. 2023-04-18 08:01:12.345 WARN 20 --- [nio-8080-exec-9] com.zaxxer.hikari.pool.PoolBase : HikariPool-3 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1d5d8..

Server/Spring JPA 2023.04.19

Spring - Kafka Producer, Consumer 설계하기!

아래는 이벤트 처리를 위해 Kafka Producer, Consumer를 설계하고 적용한 내용을 정리한 것이다. Kafka 자체에 대한 내용은 이전 포스팅을 참고하자. 참고: https://jaehoney.tistory.com/197 비즈니스 설명 필요한 비즈니스는 아래와 같이 표현할 수 있다. 메일 API가 사용자에게 요청을 받아서 발송 서버로 요청을 한다. 발송 서버는 메일을 발송한 후 비동기 이벤트를 통해 Kafka로 메시지를 전파한다. Consumer는 해당 메일 정보를 받아서 사용자 설정(Archive 설정)에 따라 메일을 영구히 보관한다. Kafka 설정 Kafka에서 Producer, Topic, Consumer에는 수 많은 설정이 있다. 해당 설정들은 성능, 가용성에 엄청난 차이를 불러온다..

Server/Spring 2023.04.17

Spring - @Component가 동작하지 않는 이슈?! (Bean과 Component 차이)

어느날 AOP를 활용한 샤딩 라이브러리를 개발하던 중에 버그가 발생했다.아래는 개발한 라이브러리의 일부이다.@Component@Aspectpublic class ShardAspect { private final DataSourceFactory dataSourceFactory; @Before("@within(org.springframework.transaction.annotation.Transactional)") public void setDataSources(JoinPoint joinPoint) throws SQLException { // 구현 }}문제는 해당 라이브러리가 API 모듈에서는 동작했는데, 컨슈머 모듈에서는 동작하지 않았다.디버깅을 했는데 생성자 쪽 브레이크..

Server/Spring 2023.04.17

MySQL - 이모지(Emoji) 뒷 내용이 모두 잘리는 문제 해결!

개발 DB에는 데이터가 잘 저장되는데 실 서버 DB에서 데이터가 잘리는 문제가 발생했다. 확인해보니 문자열의 이모지 뒷 내용이 전부 잘린 것으로 확인해서 DDL을 각 DB의 DDL을 비교해봤다. (MySQL을 사용하고 있다.) 그런데 개발 서버 DDL과 실서버 DDL이 동일했다. 그런데 왜 데이터가 개발 서버에서만 잘렸지..? utf8 vs utf8mb4 개발 서버와 실서버의 컬럼은 모두 charset - utf8을 사용하고 있었다. utf8과 utf8mb4는 어떤 차이가 있을까? utf8 - 내부적으로 한 문자당 가변으로 최대 3바이트를 사용한다. utf8mb4 - 내부적으로 한 문자당 가변으로 최대 4바이트를 사용한다. 여기서 이모지는 4바이트를 차지한다. 즉 utf8mb4로는 표현할 수 있고, ut..

Database/SQL 2023.04.05

Java - (JDK17에서는) String vs StringBuilder

Java 관련된 질문 중 String과 StringBuilder의 차이를 묻는 경우가 많다. 우리는 잘 알고 있는가..? 흔히 알려진 Java 관련 질문 중에서도 잘못된 질문과 답이 아주 많다고 생각한다. 대표적인 것 중 CheckedException과 UncheckedException의 대표적인 차이가 트랜잭션이 롤백된다는 것이다. 사실 CheckedException과 UnCheckedException은 근본적으로 트랜잭션과 아무 관련이 없다 (https://www.youtube.com/watch?v=_WkMhytqoCc) (무지성으로 공부하면서 Ctrl + C, Ctrl + V 한 결과..) String과 StringBuilder의 차이도 너무 무지성으로 외우는 경우가 많다. (나도 그랬다.) Str..

Language/Java 2023.04.04

Clean Architecture - 헥사고날 아키텍처에서 테스트 작성하기!

테스트 피라미드일반적으로 테스트의 기본 전제는 만드는 비용이 적고, 유지보수하기 쉽고, 빨리 실행되고, 안정적인 작은 크기의 테스트들에 대해 높은 커버리지를 유지하는 것이다.하나의 단위(일반적으로 하나의 클래스)가 제대로 동작하는 지 확인할 수 있는 테스트는 단위 테스트이며, 여러 개의 단위를 넘는 경계나 아키텍처, 시스템을 결합하는 테스트는 비용이 더 비싸지고, 실행이 더 느려지며, 깨지기 쉬워진다.단위 테스트는 의존하는 다른 클래스들은 인스턴스화 하지 않고 테스트하는동안 필요한 작업들을 흉내(mock)만 내도록 대체한다.통합 테스트는 하나의 기능에 필요한 여러 유닛을 인스턴스화하고 데이터를 보낸 후 전체적인 기능을 테스트한다.시스템 테스트의 경우 애플리케이션을 구성하는 모든 객체 네트워크를 가동시켜 ..