일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- JPA
- docker
- k8s
- dabase
- CI
- Oracle
- 프로그래머스
- builder-pattern
- CKA
- cd
- IntelliJ
- map
- 자바
- programmers
- java
- 뷰
- 알고리즘
- SpringMVC
- ORM
- 해시맵
- Di
- Vue
- vuejs
- hibernate
- Spring
- superBuilder
- Kubernetes
- DevOps
- 코딩테스트연습
- CI/CD
- Today
- Total
목록개발/Java (23)
문홍의 공부장
CompletableFuture 는 기존의 Future 인터페이스의 한계를 보완하기 위해 등장한 클래스이다. Future 인터페이스는 비동기 작업에 대한 결과값을 리턴받기 위해 사용되었으나, 아래와 같은 한계점이 존재한다. 외부에서 완료시킬 수 없고, get(long timeout, TimeUnit unit) 의 timeout 설정으로만 완료 가능 블로킹 코드(get()) 을 통해서만 이후 결과를 처리할 수 있음 여러 Future 를 조합하거나, 예외 처리 할 수 없음 CompletableFuture 는 이름 그대로 외부에서 '완료 가능한' Future 이다. 또한, CompletionStage 인터페이스를 구현하여 작업의 중첩, 완료 후 콜백(Future 간 조합)을 가능하게 하였다. public cl..
애플리케이션을 개발하다 보면, 하나의 테이블에서 조회하는 단순 조회 쿼리 뿐 아니라, 다수의 테이블을 조인하여 값을 조회하는 경우가 매우 빈번하게 발생한다. Querydsl은 결과를 사용자 정의하는 두 가지 방법, 즉 행 기반 변환을 위한 FactoryExpressions와 집계를 위한 ResultTransformer를 제공합니다. Querydsl의 FactoryExpression 구현 기능은 com.mysema.query.types.Projections클래스를 통해 , ResultTransformer 는 com.mysema.query.group.GroupBy를 통해 구현되어 있다. 1. Projection Projection 이란, Querydsl을 이용해 entity전체를 가져오는 것이 아니라 조회 ..
JPA를 사용하다보면 여러가지 상황을 캐치하여 작업을 해야할 경우가 생기곤 한다. 예를 들어, 데이터의 수정/삭제가 발생하였을 시 그 요청 이력을 관리하여야 한다고 가정하자. 이 때 모든 수정/삭제 로직이 끝날 때 이력 관리 테이블에 데이터를 저장하는 로직을 추가하는 것은 매우 비효율적인 일이다. 하이버네이트에서 제공하는 JPA EntityListeners 를 활용하여 엔티티의 생명 주기에 따른 이벤트를 처리할 수 있다. Callback Events PrePersist: persist() 를 호출하기 전, 새로운 엔티티가 영속성 컨텍스트에 관리되기 직전에 호출된다. 식별자 생성 전략을 사용한 경우, 엔티티의 식별자는 아직 존재하지 않는 상태이다. PostPersist: persist()를 호출한 후, f..
회원 서비스를 개발하면서, 회원을 초대하여 가입시키는 프로세스를 진행하였다. 초대 메일 발송 시에 회원 가입 링크를 보내, 유저가 링크를 클릭하여 나머지 프로세스를 진행할 수 있도록 하는 것이었다. 모든 프로세스가 완료 되어야만 회원 테이블에 저장되도록 구조를 잡았는데, 그렇기 때문에 2가지 문제가 발생했다. 초대할 회원 정보를 모두 메일 링크에 포함하게 되면, 링크가 길어질 뿐 아니라 중요 정보들이 모두 노출되게 된다. 메일 발송 내용을 DB 에 저장하고 저장한 시퀀스를 메일 링크에 포함하게 되면, 시퀀스를 통해 메일 발송 순서를 추정할 수 있게 된다. 위 두 가지 문제점을 해결하기 위해, 메일 발송 시퀀스를 암호화 한 shorten URL 을 생성하여 메일 링크가 길어지는 문제점과, 시퀀스 번호가 그..
금융 도메인이나 정산 시스템을 개발할 때에는, 무엇보다 가장 중요한 것이 숫자의 정합성이다. 돈에 가장 민감한 도메인이기에, 1원 단위의 오차로 인한 개발 건 수정이 잦게 일어났던 경험이 있다. 비용 관련 프로그램을 개발하면서 처음 마주한 것이 BigDecimal 이라는 클래스였다. 자바는 IEEE 754 부동 소수점 방식을 사용하여, 정확한 실수를 저장하지 않고 근사치 값을 저장한다. 때문에 float, double 은 소수점의 정밀도가 정확하지 않아 오차가 발생하게 된다. Type 범위 float 1.4E-45 ~ 3.4028235E38 double 4.9E~324 ~ 1.7976931348623157E308 이과 달리, BigDecimal 은 부동 소수점 방식이 아닌, 정수를 이용해 실수를 표현한다..
프로젝트에서 커스텀 헤더를 사용하여야 하는 건이 있어, API 호출 시 커스텀 헤더 값을 넣어 요청을 보내는 기능을 개발하였다. 커스텀 등록 헤더에 'X-' 를 prefix 로 붙이는 관례가 폐기된 지 오래라 하여, 'X-' 를 붙이지 않고 커스텀 헤더를 만들었다. 커스텀 등록 헤더는 'X-'를 앞에 붙여 추가될 수 있지만, 이 관례는 RFC 6648에서 비표준 필드가 표준이 되었을때 불편함을 유발하는 이유로 2012년 6월에 폐기되었습니다. 다른것들은 IANA 레지스트리에 나열되어 있으며, 원본 컨텐츠는 RFC 4229에서 정의되었습니다. IANA는 또한 제안된 새로운 메시지 헤더의 레지스트리도 관리합니다. Custom proprietary headers have historically been use..
빌더 패턴은 객체를 생성할 때 사용하는 패턴으로, 메서드 체이닝 방식으로 객체를 생성하여 코드의 가독성 및 유지보수성을 높이기 위해 흔히 사용된다. 이번 프로젝트에서 빌더 패턴을 자주 사용하면서, 그 내용을 간단히 정리해 보자 한다. 객체를 생성하는 방법 1. Constructor 생성자 함수를 이용하여 객체를 생성한다. 필수 인자를 받는 필수 생성자와, 선택적 인자를 받는 생성자를 점층적으로 추가한다 모든 선택적 인자를 받는 생성자를 추가한다 생성자 함수를 이용하면, 선택적 인자를 받아 객체를 생성하여야 하는 케이스가 많을 경우, 각기 다른 생성자를 호출하여야 한다. 인자 수가 많아질수록 그 의미를 파악하기 어려워지며, 코드의 가독성이 떨어진다. 또한, 인자가 추가될 경우 코드를 수정하기 어려워진다. ..
프론트 팀원이 보내주고 빵터진 짤 웃김 아니 사실 안웃김 죄송합니다 라고만 말하면 클납니다. (..) 솔직히 말하면 내가 저렇게 생각했다. 여태까지 feature 개발을 주로 하고, 백엔드 프레임워크를 구성하는 일은 항상 시니어 개발자/타 부서에서 담당해 주었기 때문에, CORS 에러라는 걸 고민해본 적이 거의 없었다. 프론트엔드 개발자가 많이 마주하는 에러라고 알고 있었기에 그냥 그런줄만 알고 있었다. 이번에 CORS configure 관련 코드를 세팅해 두었음에도 계속해서 CORS 에러가 발생하는 이슈가 있었고, 내가 CORS 에 대하여 잘 모르고 있다 보니 이 에러가 프론트에서 나는 문제인지, 서버 쪽 문제인지 파악하는데 시간이 걸렸다. (결론적으로 둘다 문제였다)이번 기회에 CORS 에 대해서 공..