분류 전체보기
Spring AOP self-invocation이 발생하는 이유와 @Transaction 사용시 주의사항
Spring AOP self-invocation이 발생하는 이유와 @Transaction 사용시 주의사항
2021.08.11최근 Spring AOP를 학습하는 도중 self-invocaion이라는 문제를 발견했습니다. 이 문제를 해결하면서 정리한 내용을 공유해보고자 합니다. public interface Pojo { void foo(); void bar(); } @Slf4j public class SimplePojo implements Pojo { @Override public void foo() { log.info("### foo"); bar(); // this.bar() } @Override public void bar() { log.info("### bar"); } } SimplePojo 클래스는 Pojo인터페이스를 구현한 클래스입니다. foo()는 bar()를 호출하고있는 모습입니다. 테스트 케이스 Pojo refer..
[Spring Batch] 하나의 Step에서 여러개의 ItemWriter를 사용하는 방법
[Spring Batch] 하나의 Step에서 여러개의 ItemWriter를 사용하는 방법
2021.08.04신규 도메인에서 배치 작업을 하는 도중 해결했던 문제 경험에 대해서 공유하고자 합니다. 예시) 배치로 일련의 작업을 수행한 뒤 엔티티를 JpaItemWriter를 통해 저장 / 변경하고, JdbcBatchItemWriter를 이용해서 연관 관계가 없는 단순 데이터용 테이블을 저장 / 변경한다는 가정을 해보겠습니다. 처음에 생각한건 하나의 Job에다가, 두 개의 Step을 만드는 것이었는데, 하나의 Step에서 두 개의 ItemWriter를 사용할 방법이 없을까? 찾다보니 CompositeItemWriter를 발견했습니다. 예제를 참고할 만한 자료가 없었지만, 다행이게도 내부 구현이 복잡하지 않아서 직접 코드를 짜면서 실험해도 금방 만들 수 있었습니다. CompositeItemWriter는 여러개의 Ite..
Java Parallel Programming 성능 테스트 및 고려사항 (JMH)
Java Parallel Programming 성능 테스트 및 고려사항 (JMH)
2021.07.25본 글은 Kevin Lee님의 Parallel Programming을 학습 내용을 토대로 실험한 내용입니다. 자바8에서 부터 Parallel Stream을 이용해서 병렬처리를 쉽게할 수 있습니다. 병렬 스트림은 내부적으로 ForkJoinPool을 사용합니다. 작업을 분할할 때 기본적으로 pc의 cpu의 코어 수(정확히는 스레드)만큼 작업을 분할합니다. ForkJoinPool.getCommonPoolParallelism(); // 확인 가능 (0부터 1입니다) 우선 성능 테스트를 하기 전 간단한 병렬처리에 대한 개념 예제를 보여드리겠습니다. 병렬처리 개념 실험 환경: 제 PC의 cpu사양은 8코어 16스레드를 지원합니다. 상황) 1부터 16까지 총 16개의 숫자를 출력합니다. 출력하기 전 스레드를 1초씩 ..
EventLister를 활용한 느슨한 결합 및 이벤트 처리.
EventLister를 활용한 느슨한 결합 및 이벤트 처리.
2021.07.21서론 사내에서 새로운 도메인 작업을 담당하면서 특정 로직을 실행한 뒤 후처리를 해야되는 상황에서 사용했던 방법에 대해서 공유하고자합니다. 가상 시나리오 회원 가입 -> 포인트 적립 및 이메일 발송 예제를 명시적으로 보이기위해 SignUp~, Update~Service 기능을 나타내는 네이밍을 사용했습니다. - Before: 결합도가 강하고 좋지 않은 설계 @Getter public class User { private Long id; private String email; public User(final Long id, final String email) { this.id = id; this.email = email; } } @Repository public class MemoryUserReposito..
HashMap은 어떻게 동작할까? + 자바8에서의 변화
HashMap은 어떻게 동작할까? + 자바8에서의 변화
2021.06.20hashCode의 특징 HashMap의 내부 구조 HashMap이 식별자를 구별하는 방법 Java8에서의 HashMap의 변화 자바에서 가장 많이 사용하는 자료 구조 중 하나인 HashMap은 어떻게 동작할까? 우선 HashMap을 이해하려면 hashCode랑 equals의 개념을 먼저 알고있어야합니다. (이 글에서는 다루진 않습니다) 이펙티브 자바 Item11에서는 "equals를 재정의하려거든 hashCode도 재정의하라"라는 내용이 있다. HashMap의 동작 원리를 알게되면 왜 이런 얘기를 하는지 자연스럽게 이해할 수 있다. 우선 간단하게 hashCode의 특징을 짚고 넘어가자. /** * Returns a hash code value for the object. This method is * s..
One-to-One 관계에서 Lazy 로딩은 언제 동작되는 것일까?
One-to-One 관계에서 Lazy 로딩은 언제 동작되는 것일까?
2021.06.17서론 JPA를 사용하면서 일대일 연관관계를 맺었는데 예상치 못한 쿼리를 만나게 되었고 원인을 분석하면서 알게된 내용을 공유해보려고 한다. One-to-One 관계에서는 Lazy로딩은 특정 조건에서만 동작한다. 그렇다면 언제 Lazy 로딩이 잘 동작하고, 언제는 동작하지 않으며 그 이유가 무엇인지 알아보자. 특정 조건이라는 게 그럼 무엇일까? 결론부터 말하자면 연관관계 주인쪽 엔티티 측에서는 Lazy 로딩이 정상적으로 동작한다. 다음과 같은 일대일 양방향 연관관계가 있다고 해보자 @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @OneT..
Ec2 Jenkins에 Github private repository SSH로 연동하기
Ec2 Jenkins에 Github private repository SSH로 연동하기
2021.05.10사전 필수 준비 EC2 생성 및 EC2서버에 jenkins, git 설치 EC2에서 SSH Key 생성 SSH KEY를 관리하는 방법은 다양한데요. (SSH란?) jenkins, home 혹은 github 디렉토리를 따로 만들어서 관리할 수 있습니다. 팀내, 개인이 편하신대로 진행해주시면 되겠습니다. 저는 jekins디렉토리에서 관리하겠습니다. SSH 폴더 생성 sudo -u jenkins mkdir /var/lib/jenkins/.ssh # sudo -u user command: user의 권한을 빌려서 실행합니다. jenkins 유저의 권한을 빌리는 이유는 ec2-user는 권한이 없기 때문입니다. 저는 편의상 권한을 빌려서 실행했는데, 그냥 jenkins 계정으로 변경 후 실행하셔도 됩니다. SSH..
ResponseEntity는 왜 사용하는 것이며 @RestControllerAdvice는 무엇일까.
ResponseEntity는 왜 사용하는 것이며 @RestControllerAdvice는 무엇일까.
2021.05.02스프링 3.2부터 @ControllerAdvice를 이용해서 편리하게 전역으로 exception handling을 할 수 있습니다. 저도 개인적으로 전역으로 예외를 처리 설정할 때 유용하게 쓰고 있었습니다. 그런데 우연치 않게 @RestControllerAdvice라는 어노테이션을 발견해서 해당 어노테이션을 확인해 보았습니다. 확인해본 결과 @ResponseBody + @ControllerAdvice가 합쳐진 어노테이션이었습니다. 참고로 @ReponseBody는 HttpMessageConverter를 통해서 응답 값을 자동으로 json으로 직렬화 한 뒤 응답해주는 역할을 합니다. (대표적으로 많이 사용되는 @RestController는 @Controller + @ReponseBody입니다) 순간 아차 싶..
@ConfigurationProperties를 immutable하게 설계하기
@ConfigurationProperties를 immutable하게 설계하기
2021.04.15스프링부트 2.2부터 @ConstructorBinding을 이용해서 @ConfigurationProperties를 immutable하게 설계할 수 있습니다. - @ConfigurationProperties이란 prefix에 매핑되는 외부 설정 값을 객체로 바인딩 시킬 수 있는 기능입니다. (자세한 건 문서를 참고하시면 좋을 거 같습니다) 기존 사용 방식 @Getter @Setter @ConfigurationProperties(prefix = "member") public class MemberProperties { private String firstName; private String address; private int age; } application.yml # application.yml memb..
OAuth2 동작 흐름에 대해서 알아보자
OAuth2 동작 흐름에 대해서 알아보자
2021.04.10OAuth란 사용자가 비밀번호를 노출하지 않고 다른 웹 사이트의 자신의 정보를 웹이나 애플리케이션에 접근 권한을 부여할 수 있는 개방형 표준. OAuth는 로그인 뿐만 아니라 데이터 접근 권한도 포함하고 있기 때문에, Authentication (인증) 뿐만 아니라 Authorization (인가) 도 포함하고 있습니다. OAuth는 2007년에 최초에 등장했으며 2010년에 OAuth 1.0 프로토콜 표준안이 발표되었다. 용어 정리 - Resource owner User(보호된 자원에 대한 엑세스 권한을 부여할 수 있는 사용자) - Client OAuth를 이용하기 위해 Resource 서버에 등록한 애플리케이션이나 웹 서비스. - Resource server 허용할 수 있는 보호된 리소스를 호스팅하는..
git-flow에 gitmoji를 얹어보자
git-flow에 gitmoji를 얹어보자
2021.02.11정확히 말하자면 commit 메세지에 gitmoji를 이용해서 git-flow에 적용하는 것입니다. git-flow는 git branch 전략 입니다. gitmoji란 커밋 메세지에서 이모티콘 사용을 표준화하고 설명하는 것입니다. 커밋 메세지에 깃모지를 이용함으로써 사용된 이미지만 보고 커밋의 목적이나 의도를 쉽게 식별 할 수 있습니다. carloscuesta/gitmoji An emoji guide for your commit messages. 😜 . Contribute to carloscuesta/gitmoji development by creating an account on GitHub. github.com 회사에서 전 동료님에게 추천받아서 활용하게 되었는데 굉장히 유용하게 쓰여서 공유해보려 합니..
REST API란?
REST API란?
2021.02.10GOAL REST API의 탄생 REST API란 REST API의 특징 HTTP 상태 응답 코드 REST API의 탄생 REST(Representational State Transfer) 의 약어로 1998 Roy T. Fielding이 Microsoft Research에서 최초로 소개했으며 2000년에는 박사 학위 논문으로 발표되었습니다. 로이 필딩은 HTTP 프로토콜 설계 작업에 참여한 대학원생이었으며 기존에 구축되어있는 웹하고 호환성 http 명세에 대한 기능을 고치고 추가하면서 어떻게 웹을 망가뜨리지 않고 HTTP를 진보시킬 수 있을까?라는 고민에서 시작되었습니다. REST API란? REST 아키텍처 스타일을 따르는 API으로서 HTTP를 이용해서 통신할 때 HTTP가 가진 잠재력을 최대한 이..