Lombok이란? Lombok은 자바에서 제공해주는 라이브러리로 반복적인 코드인 Getter Setter 생성자등을 어노테이션을 기반으로 생성해주며 코드 가독성을 향상시켜줍니다. (물론 어노테이션이 떡칠된 Entity를 보면 적당히 쓰는것도 필요해보입니다.) 어떻게? Lombok은 컴파일 시점에 Annotation Processor를 사용하여 @Getter와 @Setter 같은 어노테이션이 붙은 소스를 읽어들이고 이를 기반으로 새로운 코드를 생성합니다. 순서를 보기 전 미리 알아둬야할 키워드가 있습니다. 추상 구문 트리 컴파일러는 소스 코드를 분석하고 문법에 맞지 않는 부분을 찾아내고 이를 수정하거나 오류를 보고하는데 이 과정에서 소스 코드를구문 분석할 때 생성되는게 추상 구문 트리입니다. 추상 구문 트..

개인 프로젝트를 진행하면서 버그를 겪고 해결하면서 공부한 내용을 포스팅 할 예정입니다. 자세한 코드 과정과 도출 과정이 궁금하시다면 Github 를 참고해주세요 Transactional 의 동작방식 먼저 이 문제를 파악하기 전에 동작 방식을 이해해야합니다. Transactional annotation은 AOP 기반으로 동작하고 있습니다. 관리할 프록시가 생성되고 이 객체는 타깃을 감싸 해당 객체의 메소드 호출을 중간에 가로챌 수 있게 합니다. 그 후 메소드 호출 전 후 시작 커밋 롤백 등의 작업을 수행할 수 있게 코드를 주입해주고 이러한 원리 때문에 저희는 쉽게 하나의 요청단위로 묶어 비즈니스 오염 없이 트랜잭션 특징인 ACID를 위반하지 않게할 수 있습니다. 문제 상황 @Aspect @Component..

문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save(requestDto: BankAccountSaveRequestDto): SimpleBankAccountIdResponseDto { check(!validateDuplicationByAccountNumber(requestDto.number)) { throw BankAccountDuplicationException(requestDto.number) } check(!validationDuplicationByName(requestDto.name)) { throw BankAccountNicknameDuplicationE..
Thread Local은 자바에서 제공해주는 멀티 스레드 환경에서 각각의 스레드에게 별도의 자원을 제공함으로써 공유되는 서비스에서 별도의 자원에 접근하게끔 하여 각각의 스레드가 각각의 상태를 가질 수 있도록 도와주고 있습니다. 실제로 Thread Local은 Spring진영에서 유용하게 쓰이고 있습니다. 대표적으로 RequestAttribute하고 SecurityContext가 존재합니다. 그렇다면 스프링에서 유용하게 쓰이는지 알아봅시다. 예를들어 로그인 기능이 존재하고 생각해봅시다. A와 B가 각각 클라이언트 요청을 통해 로그인이 필요한 상품 구매 시스템을 이용한다고 생각해 봅시다. Thread 1 - 로그인 정보를 갖고 상품 구매 요청 싱글톤 서비스 - 요청으로 들어온 로그인 정보 검증 및 저장 Th..

자세한 건 Github를 참고해주시기 바랍니다. 배경 개인 프로젝트를 진행하면서 redis를 인증번호 저장을 목적으로 개발을 하고 테스트 하던 과정에서 저장이 되더라도 get을 하지 않는 이슈가 발생하였습니다. 이를 트러블 슈팅하기 위해서 포스팅을 하게 되었습니다. 원인 @Transactional fun authorizePhoneNumber(phoneNumber: String, authNumber: Int): Boolean { val secureNumber = authNumberRepository.findByIdOrNull(phoneNumber.substring(4)) ?: throw SecureNumberNotFoundException(phoneNumber) return secureNumber.toIn..

배경 회사에서 7만개 혹은 11만개의 데이터를 외부에서 받아와 대량으로 전송해야하는 배치 프로그램을 개발 중이었습니다. 처음엔 FeignClient를 사용하여 개발 하였습니다. 하지만 단일 스레드로는 성능이 너무 나오지 않아 11번 호출해서 데이터를 받아오는데에도 오랜시간이 소요되었습니다. 만약 7만개 이상의 데이터를 가져오려면 너무 오랜 시간 동안 배치가 실행되어야 했고, 그러면 다른 배치들과 겹쳐서 돌아가기 때문에 서버에 큰 부담이 생기거나 제가 올린 배치 때문에 병목 현상이 생기는것도 고려해야했습니다. 🤔 멀티 스레드를 사용한다면? 처음에 이 문제를 해결 하기 위해서 저는 멀티 스레드를 사용했습니다. Executor를 Bean으로 등록하고 서비스에서 주입 받아 사용했습니다. @Service @Req..
Page 인터페이스 Paging을 위해서 Spring boot에서는 Page 인터페이스를 제공합니다. 이 인터페이스의 기본 스펙을 살펴보면 다음과 같습니다. { "content": [ ... (data) ], "pageable": { "sort": { "unsorted": false, "sorted": true, "empty": false }, "pageNumber": 0, "pageSize": 7, "offset": 0, "paged": true, "unpaged": false }, "last": true, "totalElements": 7, "totalPages": 1, "first": true, "numberOfElements": 7, "size": 7, "sort": { "unsorted": fa..

JPA란? 이 관계를 알아보기 위해 JPA를 쓰는 이유에 대해서 알아봐야합니다. JPA는 ORM 기술 중 하나로 hibernate를 기반으로 자바의 객체와 DB 테이블 간의 패러다임 불일치 문제를 해결해주는 기술입니다. RDB와 Object는 엄연히 다른 존재이지만 이 불일치를 해결하기 위해 여태 많은 개발자들은 RDB 중심의 애플리케이션 개발을 주로 했습니다. 하지만 JPA가 나오면서 부터 이 불일치 문제를 해결하는 장점을 바탕으로 객체 중심의 개발이 이루어지기 시작했는데 이것이 바로 JPA의 장점이라 할 수 있습니다. public class Member { private Long id; private String email; private String password; private String na..

https://golf-dev.tistory.com/33 프로젝트 JPA 성능 개선기 (1) - 로그인 시 성능을 올려보자~! OneToOne은 기본적으로 Lazy 로딩을 지원하지 않는다. 그렇기 때문에 조회 시 Lazy로 설정 시 다음과 같은 문제가 발생한다. 일단 사전에 코드를 보여주면 다음과 같다. Member.java public class Member extends. golf-dev.tistory.com 전 글을 꼭 읽고 오시기 바란다. 이제부터 불필요한 Join문을 없애 보도록 하겠다. 추가 된 기술 스택 : QueryDSL QueryDSL은 Projections를 통해 DTO나 다른 객체에 접근하여 그에 필요한 데이터만을 조회하여 반환할 수 있다. 이 방법을 통해 우린 영속화된 Entity에..

OneToOne은 기본적으로 Lazy 로딩을 지원하지 않는다. 그렇기 때문에 조회 시 Lazy로 설정 시 다음과 같은 문제가 발생한다. 일단 사전에 코드를 보여주면 다음과 같다. Member.java public class Member extends BaseTimeEntity { // 속성 ... // @OneToOne(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private MemberCount memberCount; // == 연관관계 로직 == // public void addMemberCount(final MemberCount memberCount) { this.memb..
- Total
- Today
- Yesterday
- 취준
- 코딩
- 면접 준비
- 면접준비
- 인터뷰
- 취업준비
- 취업
- 동시성
- IT
- java
- thread
- 게시판
- Redis
- 백엔드
- MySQL
- 프로그래밍
- lock
- CS
- 개발자
- DevOps
- 개발
- 면접
- Spring
- 자바
- JPA
- docker
- DB
- 코드
- Kotlin
- 프로젝트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |