최근 Thread 를 이용해서 비동기로 처리해야하는 작업이 생기면서 비동기시 사용하는 메서드의 객체들을 어떻게 다룰 수 있을까에 대해서 고민해야 되는 상황이 생겼습니다. 그동안 추상적으로만 알고 있던 immutable object 불변객체에 대해서 정리해 보았습니다. 1. 불변객체란 객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. 반대 개념으로는 가변(mutable) 객체로 생성 후에도 상태를 변경할 수 있다. 객체 전체가 불변인 것도 있고, C++에서 const 데이터 멤버를 사용하는 경우와 같이 일부 속성만 불변인 것도 있다. 또, 경우에 따라서는 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않은 것 처..
0. out / build 폴더의 차이 IntelliJ 에서 Gradle 기반의 프로젝트를 개발하면, 아래 그림과 같이 build 와 out 이 나누어져 있는 걸 볼 수 있습니다. 열어보면 둘다 빌드한 클래스 파일들을 가지고 있는데 무슨 차이인가 의하할 수 있습니다. 결론부터 말하자면, gradle build 시에는 build 폴더에, IntelliJ 에서 빌드시에는 out 폴더에 build 파일이 생성되게 됩니다. IntelliJ 의 Project Setting 에 보면, Project > Project compiler output 에 out 폴더가 지정되어 있는 것을 볼 수 있습니다. 그래서 Gradle clean 을 하게 되면, out폴더는 삭제되지 않고 build 폴더만 삭제됩니다. intelli..
0. bytecode instrumentation jpa 의 프록시는 bytecode 조작으로 만들어집니다. 포스트의 최종목적은 OneToOne 의 양방향관계에서 프록시를 만들기 위해 발생하는 N+1 문제를 해결하는 것 입니다. 따라서 bytecode 을 조작하여 프록시 객체가 생성되지 않아도 되도록 해야하며, 또한 프록시가 초기화 되지 않더라도 나중에 필요한 순간에 객체를 가져올 수 있도록 해야합니다. 이를 위해 bytecode instrumentation 이 사용됩니다. bytecode instrumentation 은 bytecode 에 직접 수정을 가해서 소스파일의 변경없이 원하는 기능을 부여하는 기술입니다. gradle / maven 과 같은 빌드 도구의 설정파일에서 수정할 내용을 작성할 수 있습..
0. @OneToOne 의 양방향 연관 관계 다대일, 일대다, 다대다 와는 다르게 @OneToOne 매핑은 연관관계를 매핑할 수 있는 선택지가 두가지 있습니다. 아래와 같이 Post 와 PostDetail 엔티티가 있다고 생각해봅시다. @Entity class Post { @OneToOne(mappedBy = "detail") @LazyToOne(value = LazyToOneOption.NO_PROXY) private PostDetail detail; } @Entity class PostDetail { @OneToOne(fetch = FetchType.LAZY) @LazyToOne(value = LazyToOneOption.FALSE) private Post post; } 이 경우 비즈니스 로직상 더 ..