본문 바로가기

전체 글669

객체 필드 중복을 해결하는 다양한 방법들과 객체지향 패러다임을 이용한 순수 코드 방식의 해결법(feat. DDD의 Aggregate와의 연관성) 문제 정의 비슷한 역할을 하는 객체가 여러 있을 수 있다. 이때 동일한 필드를 가져 중복 코드가 다수 발생하는 문제가 생긴다. 예를 들어 일정 관리 프로그램을 만드는 과정에서 다음과 같이 Event(이벤트), Task(할일), Notification(알림) 객체들이 있다고 해보자. @Getter @NoArgsConstructor public class Event { private Long id; private LocalDateTime startAt; private LocalDateTime endAt; private String title; private String description; private User writer; private List engagements; private LocalDate.. 2023. 7. 22.
RestDocs로 API 문서를 만들어보자 (MockMvc 테스트, 커스터마이징 옵션 설정하기) RestDocs란 ? - 테스트 코드 기반으로 Restful Api 문서 생성을 돕는 도구 - Asciidoctor를 이용해서 Html 등등 다양한 포맷으로 문서를 자동으로 출력할 수 있다. - 가장 큰 장점은 테스트 코드 기반으로 문서를 작성한다는 것이다. -> 테스트 코드 강제화 -> 검증된 문서 보장 Swagger Vs RestDocs Swagger는 Api에 대한 명세 기능을 제공하면서도 호출에 좀 더 초점을 맞추고 있다. 또한 Swagger는 애노테이션 기반으로 구성해야 한다. 예를 들면 다음과 같은 방식이다. 실제 코드에 영향을 미치지는 않지만 지속적으로 명세를 추가해야 하기 때문에 복잡성이 증대된다. 집중해야 하는 비즈니스 로직에 덧붙이는 코드가 많기 때문에 가독성을 해친다. 반면 RestD.. 2023. 7. 13.
[독서 기록] 개발자 원칙 - 박성철, 강대명, 공용준, 김정, 박미정, 박종천, 이동욱(네피림), 이동욱(향로), 장동수 공저 개발자 원칙 “나도 테크 리더가 될 수 있을까? 어떻게 선배 개발자들처럼 성장할 수 있을까? 3년 10년 후에도 개발자로 살아갈 수 있을까? 팀워크는 도대체 어떻게 맞춰야 하는 걸까?” 개발자로 살아가면서 하루에도 천 번을 되묻는 물음에 컬리, 레몬트리, 카카오, 코드스쿼드, 무신사, 몰로코, 데이블, 인프런, 패스트캠퍼스 테크 리더 9명이 답합니다. 지금까지 만나 볼 수 없었던 생존과 성장의 원칙에서 자신만의 해답을 찾아보세요. 저자 박성철, 강대명, 공용준, 김정, 박미정, 박종천 출판 골든래빗(주) 출판일 2022.12.20 원칙 : 쓸모 있는 소프트웨어를 만들자 - 26, 박성철 저는 개발자를 두고 공장에 자기만의 생산 선비를 들고 들어가서 일하는 노동자라고 표현합니다. - 39, 박성철 최종적인.. 2023. 7. 13.
스프링 배치 병렬처리, mock과 static mock, AssertFile을 이용한 배치 로직 테스트 스프링 배치에는 4가지 방법의 병렬처리 방식이 있다. 275개의 데이터가 있는 input.txt 파일을 읽어 output으로 변환하는 작업을 병렬로 처리해보자. 데이터는 다음과 같다. 1 데이터-1 10 2 데이터-2 20 3 데이터-3 30 4 데이터-4 40 5 데이터-5 50 6 데이터-6 60 7 데이터-7 70 8 데이터-8 80 9 데이터-9 90 10 데이터-10 100 11 데이터-11 110 12 데이터-12 120 13 데이터-13 130 14 데이터-14 140 15 데이터-15 150 // ... 먼저 전처리를 위해 dto와 mapper를 작성한다. @Data public class AmountDto { private int index; private String name; priv.. 2023. 7. 12.
스프링 배치 Validator, listener, FlatFileItemReader 및 Writer를 사용하여 간단한 text 변환 작업을 구현해보자 JobParameterValidator @Configuration @AllArgsConstructor @Slf4j public class AdvancedJobConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job advancedJob(Step advancedStep){ return jobBuilderFactory.get("advancedJob") .incrementer(new RunIdIncrementer()) .validator(new LocalDateParameterValidator("targetDate")) .start(ad.. 2023. 7. 12.