목록분류 전체보기 (65)
개발그래머
Spring의 @TransactionalEventListener를 사용하는 이유?(@EventListener와의 차이점) Spring 4.2부터 이벤트리스너를 트랜잭션 단계에서 바인딩할 수 있는 @EventListener의 확장 애노테이션 트랜잭션 내에서 이벤트를 수신하고 처리함 기존 이벤트리스너는 데이터의 불일치가 생길 가능성이 있음 @Transactional fun save() { aRespository.save(); eventPublisher.publishEvent(aEvent); bRepository.save(); eventPublisher.publishEvent(bEvent); } bRepository를 저장하는 과정에서 에러가 발생한다면 aEvent가 만약 비동기로 발행된 상황이면 예상하지 못..

Spring의 @EventListener를 사용하는 이유? 컴포넌트 간의 결합도를 감소시켜 직접적인 의존성을 줄일 수 있음(느슨한 결합) -> 재사용성 높임 PostService와 MailService가 있을 시 PostService안에 MailService에 대한 의존성을 가지고 있지 않고 Event를 발행함으로써 직접적인 의존도를 가지지 않음 새로운 기능이나 모듈을 추가할 때 적절한 이벤트를 생성하고 리스너를 등록함으로 기존 코드를 변경하지 않고 새로운 기능을 통합할 수 있는 확장성과 유연성을 제공함 클래스별 의존성을 줄이므로 테스트가 용이해짐 사용 방법 스프링 4.2 이전에는 ApplicationEvent를 상속받아야 하고 ApplicationListener 인터페이스를 구현해주어야 했지만 이후에는..

요약 무분별한 커밋은 코드 리뷰를 하기 어려워지므로 최대한 커밋을 합친 후 PR을 날리자 시작 코드 리뷰를 할 때 주로 PR(pull request)을 사용하게 된다. PR 시 유의해야 할 점 한 가지를 소개하고 수정하는 방법에 대해 글을 작성하고자 한다. 일단 PR을 날리는 두 가지 방식이 있다. 원본 저장소를 Fork 한 후 PR을 날리는 방법(대규모 프로젝트이거나 유명 라이브러리에 기여할 때 주로 사용함) 원본 저장소에서 Branch를 만든 이후 PR을 날리는 방법(소규모 프로젝트에서 주로 사용하는 방법) 주로 2번 방식을 사용하였으며 2번 케이스를 기준으로 설명할 예정이지만 1번에도 동일하게 적용가능하다. 본론 나는 자주 저장해야한다는 강박관념과 커밋 단위를 세세하게 가져가면 좋다는 얘기를 들은 ..
상황 개발을 하면서 여러 DB 데이터, 외부 데이터를 조회를 하고 이 데이터들을 변형한 후 해당 다른 데이터에 상태를 변경해야 하는 작업 등을 할 때가 있었다. 예를 들어 업체 정보와 유저 정보를 조회한 후 하나로 합친 후 이 데이터를 조회한 유저의 상태를 변경 하는 작업을 해야 하는 경우가 있을 경우 이를 어떻게 해야 최적화를 할 수 있을지 고민해 보았다. 문득 코루틴을 사용하여 최적화하면 어떨까라는 생각을 하였고 코드를 작성하였다. 기본 코드 작성 @Service class UserService( private val userRepository: UserRepository, private val userReader: UserReader, ) { private val logger: Logger = Lo..
목표문자열, 콜렉션, 스트림에 대해 학습하세요학습할 것 (필수)문자열(String)콜렉션(Collection)스트림(Stream)문자열(String)String의 기본 개념Java에서 불변(immutable) 객체임한 번 생성된 String 객체는 변경할 수 없음문자열 조작은 항상 새로운 문자열 객체를 생성함java.lang 패키지에 포함되어 있으며 별도의 임포트 없이 사용할 수 있음String의 불변성멀티스레드 환경에서도 String 객체를 안전하게 공유할 수 있음(Thread-safe)JVM은 문자열 리터럴을 String Pool이라는 메모리 영역에 저장하므로 동일한 문자열 리터럴이 재사용되므로 메모리를 절약할 수 있음(캐싱 가능)String s1 = "Hello";String s2 = "Hello"..

목표 최근 테스트 코드를 작성하면서 여러 라이브러리들의 assert가 있어서 어떤 게 어떤 라이브러리에 속한 것이고 어떤 게 어떤 부분인지 헷갈렸다. 그래서 AssertJ와 Hamcrest중 그래도 많이 사용하는 AssertJ에 대해 정리하고 넘어가려고 한다. 정리할 내용은 https://assertj.github.io/doc/#assertj-core-simple-example 공식 문서를 기반으로 정리할 것이다. 테스트 코드는 예전 객체지향과 사실과 오해라는 책을 공부하면서 만든 엘리스, 트럼프 클래스에 대해 테스트 코드를 작성해 볼 것이다. AssertJ Core AssertJ Core 라이브러리는 자바 8 이상의 버전을 요구한다 스프링부트에서는 자동적으로 AssertJ Core 라이브러리를 spir..
Gradle 이란? 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 오픈 소스 빌드 자동화 도구 빌드 자동화 도구 소프트웨어 개발 프로세스에서 소스 코드를 컴퓨터에서 실행 가능한 소프트웨어로 변환하는 작업인 빌드 과정을 자동화하는 도구 소스코드를 컴파일하고 링크하고 패키징하여 실행 가능한 애플리케이션, 라이브러리, 혹은 배포 가능한 파일로 만드는 작업임 소스 코드 컴파일과 링크 의존성 관리 단위 테스트 실행 코드 정적 분석과 검사 리소스 복사 및 패키징 릴리즈 빌드 생성 배포 가능한 파일 생성과 배포 대표적인 도구들로 Apache Maven, Gradle, Ant 등이 있음 Maven과 Gradle의 차이 자바 진형에서 주로 사용되는 빌드 도구들로 간략한 차이에 대해 설명하겠음 차이점 Maven G..
발견 코드를 리팩터링하며 보인 문구이며 왜 이 문구가 발생했는지 궁금하여 찾아보게되었다. 과정 List emails = communityUserRepository.findByCommunityId(1L).stream() .filter(communityUser -> communityUser.getCreatedUser().getEmail() != null) .map(communityUser -> communityUser.getCreatedUser().getEmail()).collect(Collectors.toList()); 해당 커뮤니티에 해당하는 유저들을 가져오는 로직에서 'filter()' and 'map()' can be swapped 라는 문구가 인텔리제이에서 발생한것이다 List emails = co..