All

JAVA

불변 객체는 뭘까? 그리고 코틀린은 디폴트가 final?!

프로그래밍에서 가변성의 문제가변성은 상태를 가지는 경우를 얘기한다.상태를 변경하는 행위는 메모리의 저장된 값을 변경하는 행위이렇게 메모리에 저장된 하나의 값을 누구든지 변경할 수 있다는 것은 무분별한 상태가 변경이 된다는 것을 의미한다.가변성의 문제멀티스레드에서 값을 보장하지 못함.값의 예측이 어렵고 변경에 있어서 위험하다.테스트와 디버깅이 어렵다.상태 변경 발생 시 처리를 해주어야한다.불변 객체 (Immutable Object)란- 객체지향 프로그래밍에 있어, 생성 후 그 상태를 바꿀 수 없는 객체를 말한다.- 경우에 따라서 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않은 것처럼 보인다면 불변 객체로 보기도 한다.- 불변 객체를 사용하면 복제나 비교를 위한 조작을 단순화 할 수..

테스트

제대로 알고 쓰자! 테스트 대역 (Test Double) [더미 / 페이크 / 스텁 / 모의객체 / 스파이]

업무나 협업 프로젝트를 진행하면서 테스트 코드를 작성할 때 다양한 테스트 방법이 사용된다.그 중에서도 Test Double은 실제 객체를 대신하여 테스트에 사용되는 객체를 말하는데, 종종 개발자간 서로 이해한 개념이 달랐던 적이 있어서 오해가 생긴 일도 있었다. 특히 Mock과 Stub의 차이점이나, Spy와 Mock의 차이점 등에서 혼란이 있었다. 그래서 이 개념을 정확히 이해하고 상황에 맞게 사용하는 것이 중요하기에 짚고 넘어가려고 한다.더미 (Dummy)class DummyEmailService : EmailService { override fun sendEmail(email: String, message: String) { // 아무 동작도 하지 않음 - 단순히 파라미터를 채우기..

트러블 슈팅

JPA를 사용한 데이터 조회 시 findByXXX() vs findAll() + stream(filter): 성능 비교 분석

🤔 문제 상황DB 조회 시 성능 최적화는 개발자들이 자주 마주치는 과제이다.특히 복잡한 엔티티 관계와 다양한 응답 값 설정이 필요한 상황에서는 더욱 그렇다. 이러한 맥락에서 findByXXX() 메소드를 사용하여 DB에서 직접 필터링하는 방식과 findAll()로 모든 데이터를 가져온 후 Java의 stream API를 이용해 필터링하는 방식 중 전자가 더욱 성능에 좋다고는 알고 있었지만, 어떻게/ 왜 더 효율적인지에 대한 의문이 생겼다.실무에서는 종종 findAll()을 사용한 후 stream의 filter 등으로 데이터를 가공하는 접근법을 볼 수 있었다. 이는 주로 빠른 개발 속도를 위해 선택되며, 복잡한 연관 관계에서 SQL 쿼리 작성에 시간을 들이는 대신 컴파일 시점에 확인 가능한 stream ..

JPA

JPA/DDD 관점에서의 직접 참조/간접 참조

🤔 문제 상황JPA를 사용하며 객체를 설계할 때, 직접 참조와 간접 참조 각각 어느때에 사용하면 적절할지에 대한 고민이 생겼다.더불어 회사에서 코드 리뷰를 하다가 간접 참조로 설계를 한 팀원의 코드에 왜 여기서 간접 참조를 했나요? or 왜 여기는 직접 참조를 했나요? 등의 리뷰를 보고 나도 아무 생각없이 객체간 설계를 하고 있던 것은 아닌가 하는 생각이 들었다.🕊️ 나의 생각우선 각 용어의 뜻을 보자면직접 참조 : 말 그대로 Entity간의 참조를 직접적으로 하는 것이다. 구체적인 방법으로는 JPA 사용시 @OneToOne / @ManyToOne등의 어노테이션을 써서 매핑(참조)를 하는 것을 말한다.간접 참조 : 직접 참조의 반대의 의미로, 외래키(FK)를 맺지 않고 다른 Entity의 (더 나아가..

트러블 슈팅

try-catch와 @Transactional을 함께 사용시 트랜잭션 롤백 여부

🤔 문제 상황스케줄러를 사용하고 있는 프로젝트가 있다. 해당 스케줄러가 주기적으로 동작하던 와중 아래와 같은 롤백 예외 로그가 찍혔다.... ERROR ... [askScheduler-10] c.w.b.b.l.CreateDeliveryMessageListener : org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnlyat o.s.orm.jpa.JpaTransactionManager.doCommit(JpaTr..

JPA

연관 관계가 Lazy Loading일 때, 해당 엔티티를 사용하는 메서드에 @Transactional이 없다면?

🤔 문제 상황JPA에서 엔티티 간 연관 관계를 Lazy Loading으로 설정했을 때, 이 엔티티를 사용하는 메서드에 @Transactional 어노테이션이 없다면 LazyInitializationException이 발생할 수 있다.예시 코드로 보자면@Entitypublic class User { @Id private Long id; @OneToMany(fetch = FetchType.LAZY) private List orders;}public class UserService { public void processUserOrders(Long userId) { User user = userRepository.findById(userId).orElseThrow(); ..

도서/리뷰

[도서 리뷰] 만들면서 배우는 클린 아키텍처

취업 준비 과정에서 아직 필요성을 크게 느끼지 못해 클린 아키텍처를 적용해 본 경험이 없었습니다. 하지만 요즘 신입 채용 공고를 보면 드문 드문 아키텍처에 관한 우대사항도 보이고, 많은 기업들의 블로그,유튜브 영상을 보면 아키텍처에 관한 부분이 많은 부분을 차지하고 있다라고 느꼈습니다. 당장 제가 사용해볼만한 부분은 아니라고 생각하지만, 이번에 '만들면서 배우는 클린 아키텍처'를 읽으며 주로 많이 사용해왔던 레이어드 아키텍처와 책에서 소개하는 클린 아키텍처의 차이를 비교해가며 공부할 수 있었습니다. 책을 통해 서비스 레이어가 클린 아키텍처에서는 유스케이스로 대체되는 등 각 계층의 역할과 규칙을 이해할 수 있었습니다. 정보 저자 : 톰 홈버그 옮긴이 : 박소은 감수 : 조영호 한줄평 : 실제 예제 프로젝..

도서/리뷰

[도서 리뷰] 가상 면접 사례로 배우는 대규모 시스템 설계 기초1

최근 취업 준비를 하며 면접도 보러오는 등, 더디지만 조금의 발전을 하고 있다고 스스로 느끼고 있습니다.개인 프로젝트를 프론트부터 배포까지 A to Z 진행을 해보는 것은 저에게 큰 도움이 되었고, 하나의 서비스를 혼자서 진행해보니 시스템 설계에 관해서도 관심이 많이 갔습니다.그러던 중 꼭 읽고 싶어서 샀지만 아직 와닿지가 않아 묵혀 두었던 '가상 면접 사례로 배우는 대규모 시스템 설계 기초1' 을 다시 꺼내 읽었습니다. 정보 저자 : 알렉스 쉬 옮긴이 : 이병준 한줄평 : 여러가지 시스템 설계 디자인을 가볍게 알아볼 수 있는 책 읽으면 좋을 독자 : 프로젝트를 몇번 해봤고, 단순히 API만 짜본 것이 아니라 시스템 설계에 대해서 고민을 해본 독자들 (반대로 기본적인 API 구성만 해본 독자는 당장 와..

맹수호빵
'분류 전체보기' 카테고리의 글 목록