Study 20

String 을 잘 써보자

String 은 Java에서 가장 오래되고 많이 다루는 자료형 중 하나입니다. 그만큼 다루는 방법도 여러 가지인데요. 실무를 하면서 헷갈리기 Best Practice를 기록해 봅니다. 단 String의 반복 연산은 일반적이지 않기에 다른 개선에 비해 드라마틱하지 않습니다. 그리고 실무에서는 팀 컨벤션으로서의 코드 일관성이 우선이기에 무조건적인 적용은 권장하지 않습니다. 각 항목별 제목으로 Best Practice가 기록되어 있습니다. 그래프의 수치는 높을수록 좋은 성능을 의미합니다. 1. String 은 Immutable 합니다. 워낙에 많은 블로그에 잘 소개되어 있기에 이어질 내용의 배경으로서 기록은 하지만 내용은 생략합니다. String과 Mutable, Immutable에 대해서 헷갈린다면 검색해보..

Study 2021.10.16

@Component vs @Configuration

개발하면서 Component와 Configuration 어노테이션은 많이 만났었지만 이 글을 작성하기 전에는 @Configuration 은 설정 클래스에 사용하는 어노테이션 @Component는 Bean 클래스에 사용하는 어노테이션 정도로만 알고 있었습니다. 하지만 공부하다 보니 모호하게 알고 있던 부분을 좀 더 알게 되었고, 이 내용을 기록해 봅니다. # 비교 @Component @ComponentScan 을 통해 검색됩니다. @SpringBootApplication에 래핑 되어 있기에 일반적으로는 신경 쓰지 않아도 됩니다. 용도에 맞춘 스테레오 타입의 어노테이션을 가지고 있습니다. @Controller @Service @Repository @Configuration 가능하면 스테레오 타입을 사용합니다..

Study 2021.09.25

mongoDB tutorials

이번에 회사의 새로운 아이템을 프로토타입으로 만들 일이 생겼는데 회사에서 주로 사용하는 툴에 익숙해질 겸 가볍게 NCP와 mongoDB 를 사용해서 구성해보기로 했습니다. Naver Cloud Playform - 처음 만져봄. mongoDB - select 문도 할 줄 모름. 목표 머신러닝으로 돌린 데이터를 mongoDB 에 적재합니다. 이미 운영 중인 AWS EC2 서버에서 NCP로 연결합니다. NCP - Cloud DB for MongoDB 구성 AWS 가 아닌 NCP를 사용한 이유는 크레디트를 투자받았기 때문입니다. 퀵스타트 가이드가 잘 돼있어서, 캡처보다는 한 작업들을 서술형으로 작성합니다. 항목 Dev Prod Dev(계획) Prod(계획) 서버 구성 Stand Alone Stand Alone ..

Study 2021.05.18

API Versioning 전략

API Versioning은 불특정 다수의 컨슈머가 접속하는 OpenAPI를 지원하기 위해 필수적인 요소 중 하나로, 설령 컨슈머가 한 곳이라고 하더라도 원활한 적용과 장애 시간 최소화를 기대할 수 있습니다. (물론 훌륭한 배포 전략을 준비하면 더 좋습니다.) 아래는 일상 속 사물이 알려주는 웹 API 디자인 을 읽고 해결한 고민과 경험을 기록해봤습니다. 브레이킹 체인지 - 호환성을 지원하지 않게 되는 변경 (특히 하위 호환성) 컨슈머 - API 를 사용하는 클라이언트 (프론트) 프로바이더 - API를 제공하는 서버 (백엔드) 일상 속 사물이 알려주는 웹 API 디자인 - YES24 웹 API는 새로운 서비스나 앱을 만들 때 기존에 존재하던 서비스가 제공하는 기능을 활용할 수 있도록 해준다. 굳이 기존 ..

Study 2021.04.14

토끼책을 읽고 - 메시지를 믿을 수 있을까? (2)

[v4] 조금 다른 예를 들어보겠습니다. /* 1. 제품을 만들기 위한 부품 (인자로서 사용됨을 표시하기 위해 Dto 표기) */ @Setter @Getter @NoArgsConstructor public class PartDto { // 모든 곳에서 필요합니다. private Boolean steal; // 컴퓨터와 핸드폰에서 필요합니다. private Boolean semiconductor; // 선풍기에서 필요합니다. private Boolean propellers; // 선풍기와 핸드폰에서 필요합니다. private Boolean button; } /* 1. 제품을 만들기 위한 부품이 있는지 확인하고 있으면 만드는 서비스 */ public class ProductService { public bo..

Study 2021.03.08

토끼책을 읽고 - 메시지를 믿을 수 있을까? (1)

이전 회사에서는 객체 지향적인 설계보다는 일단 되는 프로그램을 만드는 게 먼저였는데, 이번에 옮긴 회사에서는 객체 지향에 대한 투자를 많이 하는 것 같습니다. 이론의 부족함을 느꼈기에 이전에 읽으려다 만 토끼 책 (객체지향의 사실과 오해 - 조용호 저)을 읽어봤습니다. 역할, 책임 & 메시지, 협력 대부분 좋은 내용이고 이전에 구현한 어설픈 OOP, ORM에 대한 고민을 해결해줬지만, 하나가 계속 걸려서 이 글을 쓰게 되었습니다. 메시지를 믿을 수 있을까? 책에서 언급되지 않은 부분은 각색하고, 관련된 코드의 브랜치를 스텝별로 대괄호 표시했습니다. https://github.com/Hyune-c/Trust-Message/tree/master [v1] 책에서는 판사-토끼-증인을 객체로서 책임과 메시지를 설..

Study 2021.03.08

비동기 테스트 만들기

비지니스 로직을 하다 보면 외부 API 호출을 할 때가 많은데, 속도를 위해 비동기 처리를 하곤 합니다. API로 구현된 비동기 처리는 예제가 많았지만, 서비스로 구현된 비동기 처리는 예제를 찾기 힘들었습니다. 아래는 메인 로직 후 이메일을 보내는 비동기 후처리 로직을 분리하고 테스트한 예제입니다. 결론 Reactor 객체를 메서드의 반환 값으로 받습니다. 테스트할 때는 block() 을 걸어 동기 처리를 합니다. 비동기 이메일 전송 메소드 Before request 메서드에서 request 객체를 만들고 비동기 발송까지 모두 하고 있습니다. 지금은 후처리 로직이 로깅뿐이지만, 로직이 들어가는 경우 메서드가 복잡해집니다. 비지니스 로직의 메서드인 sendEmail에서는 발송 결과를 알지 못합니다. // ..

Study 2021.02.25

Querydsl 로 가는 길

여느 때처럼 재미있는 글을 찾다가 예전에 비슷하게 했던 실수를 비슷한 방법으로 고치는 글을 보는데.. Querydsl 이 그냥 갑자기 눈에 띄었고, 그냥 갑자기 하고 싶어졌다. 뽐뿌라는 건 갑자기 오나보다. 그렇게 야밤의 삽질을 적어봅니다. 코드리뷰 적응기(feat. 파일럿 프로젝트) - 우아한형제들 기술 블로그 안녕하세요. 결제정산개발팀의 권세희입니다.저는 정산업무를 맡게 되었는데, 정산은 데이터 정합성과 트랜잭션, 도메인 주도 개발, Entity 간의 연관 관계, 대용량 데이터 처리가 핵심인 시스템 woowabros.github.io 자아성찰 현재의 구성 SpringBoot 2.x 모놀리스 서비스 2개로 구성된 Postgresql DB mybatis 80%, JpaRepository 20% 내 실력 ..

Study 2020.12.02

ParameterizedTest 를 잘해보자

처음 ParameterizedTest를 본건 코드스쿼드 멤버의 코드를 리뷰하면서 였습니다. @CsvSource의 단순한 형태였던 것으로 기억하는데, 당시에는 러닝 커브의 이유로 공부하지 않았었습니다. 하지만 이제는 회사에서의 개발을 시작하면서, 몇 가지 시도를 해봤고 조금은 마음에 드는 코드가 나와 글을 써 봅니다.라고 하지만 이 글을 쓰는 순간에도 설정 에러가 나고 있습니다 🤣 영감을 준 Sunny에게 감사를. ParameterizedTest에 대한 설명은 더 좋은 자료들이 많으니 Annotaion 만 정리하고 넘어가겠습니다. Annotation Description @ValueSource literal 배열 값으로 테스트 @EnumSource Enum 값으로 테스트 @MethodSource 가공이 필..

Study 2020.08.21

Stream 의 병렬 처리란?

Stream 은 Java 8에 추가된 Lambda를 활용할 수 있는 기술 중 하나로, 연속된 요소의 집합을 순차 처리합니다. Stream의 병렬 처리는 데이터 병렬성을 구현한 것으로, 내부적으로는 Fork-Join Framework를 이용하며 성능을 향상할 수도 있지만 몇 가지 주의 사항이 있습니다. No storage 별도의 저장 공간이 필요하지 않습니다. Immutable 원본을 수정하지 않고 결과를 생성합니다. Laziness 결과를 위한 최소한의 동작만을 수행합니다. Possibly 무한한 값을 가질 수 있습니다. Consumable 스트림의 요소는 생명 주기 동안 한번만 사용됩니다. 사용하면 좋은 경우 충분한 개수의 가용 코어와 충분히 큰 요소당 처리 시간 처리 시간이 Thread Pool 과 ..

Study 2020.08.21