본문 바로가기
반응형

분류 전체보기179

Reflection(리플렉션) 활용 앞서 프록시를 사용해서 기존 코드를 변경하지 않고 부가적인 기능들을 추가할 수 있는 방법을 배웠습니다. 앞 게시글에서 보았듯이 프록시만 적용한다면 해당 클래스 수만큼 부가적인 기능을 위한 프록시 클래스를 만들어야 한다는 단점이 있습니다. 이러한 단점을 보안하기 위해 자바에서 기본적으로 제공하는 JDK 동적 프록시 기술이나 CGLIB(개발자는 굳이 사용할 일이 없지만 그래도 알아놓자!) 같은 프록시 생성 오픈소스 기술을 사용하면 객체를 동적으로 만들 수 있습니다. 간단하게 리플렉션을 설명하자면 클래스나 메서드의 메타정보를 사용해서 동적으로 호출하는 메서드를 유연하게 끼워 넣을 수 있습니다. https://applepick.tistory.com/160 2022. 5. 22.
인터페이스 기반 프록시 VS 클래스 기반 프록시 https://applepick.tistory.com/159 프록시 패턴과 데코레이터 패턴 인프런 스프링 고급 원리를 들으면서 프록시 패턴과 데코레이터 패턴을 공부하고 있습니다. "둘이 뭔가 비슷한데? 뭐가 다른거지? 정확하게 어떠한 상황에서 사용해야 할까?"라고 느껴 정리를 applepick.tistory.com 앞서 프록시 패턴과 데코레이터 패턴에 대해서 간단하게 정리해보았습니다. 공부하면서 인터페이스에 기반한 프록시와 클래시 기반의 프록시의 장단점을 비교해보려고 합니다. 인터페이스가 없어도 클래스기반으로 프록시를 만들 수 있습니다. 클래스 기반의 프록시는 해당 클래스만 적용시킬 수 있고, 인터페이스 기반 프록시는 해당 인터페이스만 같다면 전체적으로 적용해서 사용할 수 있습니다. 클래스 기반 프록시는.. 2022. 5. 15.
프록시 패턴과 데코레이터 패턴 인프런 스프링 고급 원리를 들으면서 프록시 패턴과 데코레이터 패턴을 공부하고 있습니다. "둘이 뭔가 비슷한데? 뭐가 다른거지? 정확하게 어떠한 상황에서 사용해야 할까?"라고 느껴 정리를 해보려고 합니다. 프록시 패턴을 간단하게 말하자면 프록시는 다른 어떤 것과 이어지는 인터페이스의 역할을 하는 객체입니다. 객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 합니다. 쉽게 이야기해서 서버와 프록시는 같은 인터페이스를 사용해야 합니다. 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 합니다. 프록시 패턴에서 클래스 의존관계를 보면 클라이언트는 서버 인터페이스( ServerInterfac.. 2022. 5. 10.
템플릿 메서드 패턴 GOF 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의했습니다. "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다." [GOF] 부모 클래스에 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것입니다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있습니다. 결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것입니다. 하지만 템플릿 메서드 패턴은 상속을 사용합니다. 따라서 상속에서 오는 단점들을 그대로 안고 갑니다. 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가.. 2022. 4. 25.
Spring에서 동시성 문제를 해결해보자! [+ThreadLocal] 예를 들어 보드게임 중 할리갈리라는 게임이 있죠. 어떤 과일이든 합이 5개가 된다면 빠르게 종(인스턴스)을 치고(스레드) 해당 카드를 가져가는 게임입니다. 이 상황과 비슷하다고 느껴지지 않나요? 동시에 하나의 종을 여러 플레이어가 접근하는 게임입니다. 간단하게 이야기해보자면, 여러 스레드가 동시에 같은 인스턴스의 필드의 값을 변경하면서 발생하는 문제를 동시성 문제라고 합니다. 이러한 동시성 문제는 지역 변수에서 발생하지는 않습니다. 자바에서 지역변수는 스레드마다 각각 다른 메모리 영역을 할당하기 때문입니다. 또한, 값을 읽기만 했을 경우 동시성 문제가 발생하지는 않습니다. 다른 곳에서 값을 변경할 때 문제가 생깁니다. 이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이.. 2022. 4. 19.
메서드 시그니처를 신중히 설계하자! 메서드를 생성할 때 쓰기 쉬우며, 오류 가능성이 적은 API를 만드는 방법을 배워보겠습니다. ⚠️ 메서드 이름을 신중히 짓자 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표입니다. 긴 이름을 피하는 게 좋습니다. 애매하면 자바 라이브러리의 API 가이드를 참고하면 좋을 것 같습니다. ⚠️ 편의 메서드를 너무 많이 만들지 말자. 모든 메서드는 각각 자신의 소임을 다해야합니다. 메서드가 너무 많은 클래스는 학습, 사용, 문서화, 유지보수, 테스트하기가 정말 어렵습니다. 인터페이스도 마찬가지입니다. 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두는 방법도 있습니다. 확신이 서지 않으면 만들지않는 게좋습니다. ⚠️ 매개변수 목록은 짧게 유지! 매개변수는 4개 이하가 가장 이상.. 2022. 4. 9.
[index] B+-Tree, Hash Table 이번에는 인덱스에 관련돼서 정리해보려고 합니다. 간단하게 설명하자면 단어를 찾아보기 위해 백과사전을 보고 있다고 생각해봅니다. 이때 특정 단어를 검색해보기 위해 책장을 무수히 넘겨봅니다. 한 번은 이렇게 찾는다 쳐도 수 백번, 수 천 번 그런다면 정말 비효율적이겠죠? 이럴 때 필요한 게 목차입니다. 특정 단어의 위치를 목차에서 보고 위치를 유추할 수 있습니다. 이 역할을 하는 게 바로 인덱스입니다. 데이터베이스에서 인덱스란? 테이블에 대한 동작(검색)의 속도를 높여주는 자료 구조를 뜻합니다. 인덱스는 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있습니다. 고속의 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공합니다. 인덱스를 저장하는 데 필요.. 2022. 3. 19.
가변인수는 신중하게! 이펙티브 자바에서 읽었던 가변 인수에 대한 것을 정리해보았습니다. 가변 인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을수있습니다. 가변 인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 열을 만들고 인수들은 이 배열에 저장하여 가변 인수 메서드에 건네줍니다. 인수가 1개 이상이어야 할 때도 있습니다. 예를 들어 최솟값을 찾는 메서드인데 인수를 0개만 받을 수도 있도록 설계하는 것은 좋지 않습니다. static int min(int... args){ if(args.length ==0){ throw new IllegalStateException("인수가 1개 이상 필요합니다"); } int min = args[0]; for(int i=0;i 2022. 3. 16.
[디자인패턴] Domain Model Pattern vs Transaction Script Pattern Domain Model Pattern [도메인 모델 패턴]이란? 대부분의 비즈니스 로직이 엔티티 안에 구성되어있습니다. 서비스 계층은 엔티티에 필요한 역할을 위임하는 역할을 합니다. 엔티티 안에 비즈니스 로직을 가지고 객체지향을 활용하는 기법입니다. (DDD를 접목시킬 경우 이 방법을 사용합니다.) Transaction Script Pattern [트랜잭션 스크립트 패턴]이란? 엔티티에 비지니스로직이 거의 없고, 서비스 계층에서 비즈니스 로직을 처리하는 방법을 가리킵니다. 엔티티는 단순하게 데이터를 전달하는 역할이 되면서 서비스 로직이 커지게 됩니다. 간단하게 주문 엔티티가 있다고 가정해봅니다. 도메인 모델 패턴으로 구현하면 @Entity @Table(name = "orders") @Getter @Set.. 2022. 3. 13.
반응형