본문 바로가기

전체 글

(41)
[Redis] Sorted Set을 활용한 랭킹 서비스 구현 예제 Redis에는 여러가지의 데이터 타입이 존재하는데, 그 중 중복이 허용되지 않고, 자동으로 정렬기능을 제공해주는 Sorted Set을 알아보려고 합니다. 참고로 Sorted Set을 알아본 뒤, 이 자료구조를 활용하여 간단한 랭킹 서비스를 만드는 예제도 공부해보려고 합니다. Sorted Set 명령어 ZADD - key에 score와 value를 저장 ZRANGE - score로 정렬된 데이터를 start, end 인덱스를 입력하여 범위에 포함되는 데이터를 조회. score값이 오름차순으로 정렬된다. ZREVRANGE - score로 정렬된 데이터를 start, end 인덱스를 입력하여 범위에 포함되는 데이터를 조회. score값이 내림차순으로 정렬된다. ZRANK - key에 입력한 요소의 순위를 조회..
[JPA] 페치조인(fetch join) 이번 포스팅에서는 JPQL을 사용할때, 성능최적화를 위해 사용되는 페치조인(fetch join)에 대해서 알아보려고합니다. 먼저, 페치조인은 어떤 성능문제가 발생할때 사용되는 것일까요?? 바로 JPA fetch전략인 지연로딩(Lazy Loading)과 즉시로딩(Eager Loading)에 의해 N+1문제가 발생할때, 주로 사용하게 됩니다. 그럼 N+1문제가 발생하는 예제코드를 보도록 하겠습니다. 예제코드(N+1문제가 발생하는 코드) @Entity public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToO..
[Java] Message Digest 암호화 방식 공부하기에 앞서 먼저 알아둘 것이 있는데, 해싱과 암호화는 어느 정도 비슷하다고 생각할 수 있으나, 암호학적으로 본다면 차이가 있습니다. 먼저, 가장 큰 차이점은 "방향성"입니다. 단방향, 즉 평문을 암호화하고 난 후 복호화가 불가능한 것이 해싱이다. 양방향, 즉 평문을 암호화하고 난 후 복호화가 가능한 것이 암호화이다. 단방향 해시함수 이번에 공부할 MessageDigest함수는 단방향. 즉, 해싱에 대해서 알아 보려고 합니다. 간단하게 그림으로 설명을 해보자면 다음과 같습니다. Password를 MessageDigest함수를 사용하여 해싱은 가능하지만, 반대로 암호화된 데이터를 복호화하지는 못하는 의미입니다. 그렇다면, 가장 대표적인 해싱 알고리즘에는 어떤 것들이 있을까요?? 대표적으로는 MD5, S..
[Spring] 스프링 AOP 지금까지는 순수하게 AOP를 사용하기위해 스프링에서 무엇을 제공하고 어떤 개념을 알아야 하는지 공부했다면, 이번 포스팅에서는 스프링 AOP에대한 사용방법을 상세하게 알아보려고 합니다. AOP란? 결론부터 말씀드리자면, AOP는 핵심적인 기능과 부가적인 기능을 분리하는데에 그 목적이 있습니다. 예를들어서 OrderService클래스의 주문을 하는 로직이 있다고 가정합니다. 그리고 주문을 할때마다 로그를 볼 수 있는 기능을 넣는다면, 아래와 같은 이미지가 될 것입니다. 그런데 이러한 부가기능을 모든 클래스에서 사용되고 있다면???? 아래와 같은 그림이 될 것입니다. 사실 부가 기능이 모든 클래스가 들어가게 된다면, 반복되는 코드가 추가되고 핵심 기능과 부가 기능이 분리되지 않기때문에 유지보수 측면에서 굉장히..
[Spring] 빈 후처리기 이번 글에서는 빈 후처리기를 크게 3가지로 알아보려고 합니다. 빈 후처리기 빈 후처리기 - 예제코드 스프링이 제공하는 빈 후처리기 빈 후처리기란? 빈 후처리기는 스프링이 @Bean 혹은 컴포넌트 스캔으로 생성한 객체를 스프링 컨테이너에 등록하기 전에 조작하는 기술입니다. 빈 후처리기를 사용하기 위해서는 BeanPostProcessor라는 인터페이스를 구현해야하는데, BeanPostProcessor인터페이스의 Default메서드인 postProcessAfterInitialization를 Override하여 구현하면 됩니다. 일반적인 빈 후처리기의 과정을 보도록 하겠습니다. 스프링은 @Bean 혹은 컴포넌트 스캔 대상이되는 빈객체를 생성합니다(ex : A객체) 스프링 컨테이너(빈 저장소)에 등록하기 전에 빈..
[Spring] 프록시 팩토리 이번 글에서는 프록시 팩토리에대해서 알아보려고 합니다. 프록시 팩토리란? 동적으로 프록시를 만들어주는 기술은 크게 2가지로 JDK 동적 프록시와 CGLIB이 있습니다. 인터페이스가 존재하는 경우라면 JDK 동적 프록시가 제공하는 InvocationHandler를 사용하여 부가 기능을 제공하고, 인터페이스가 존재하지 않는다면 CGLIB이 제공하는 MethodInterceptor를 사용하여 부가 기능을 제공하게 됩니다. 그렇다면, 인터페이스가 있는 경우와 없는 경우가 공존하게 된다면, 우리 개발자들은 2가지 형태 즉, InvocationHandler와 MethodInterceptor을 중복으로 만들어서 관리하는 불편함을 경험하게 됩니다. 이러한 불편함을 제공하지 않기 위해 스프링은 일관된 방법으로 사용자가 ..
[Java] CGLIB(Code Generator Library) 이번 글에서는 CGLIB의 개념과 사용방법을 간단하게 알아보려고 합니다. CGLIB(Code Generator Library)과 동적 프록시(Dynamic Proxy) CGLIB은 이전 포스팅에서 정리했던 동적 프록시와 거의 동일한 패턴으로 프록시를 사용한 기술 중 하나입니다. [Java] 동적 프록시(Dynamic Proxy) 이번 글에서는 동적 프록시(Dynamic Proxy)가 왜 필요하고 어떻게 사용되는지 알아보려 합니다. 동적 프록시(Dynamic Proxy)와 프록시(Proxy) 동적 프록시가 왜 필요한지 알기위해서는 그전에 프록시가 사 gong-story.tistory.com 동적 프록시는 인터페이스가 있어야 프록시 클래스의 자동생성이 가능하였지만, 이번 시간에 공부할 CGLIB은 인터페이스..
[Java] 동적 프록시(Dynamic Proxy) 이번 글에서는 동적 프록시(Dynamic Proxy)가 왜 필요하고 어떻게 사용되는지 알아보려 합니다. 동적 프록시(Dynamic Proxy)와 프록시(Proxy) 동적 프록시가 왜 필요한지 알기위해서는 그전에 프록시가 사용되는 이유에대해 먼저 알아야 합니다. 프록시는 타겟 코드의 수정없이 접근제어 혹은 부가기능을 추가하기 위해 주로 사용됩니다. 하지만, 프록시를 사용하기 위해서는 대상 클래스 수만큼의 프록시클래스를 하나하나 만들어줘야하고 그 안에 들어가는 반복되는 코드때문에 코드중복이라는 단점이 있습니다. 이러한 단점들을 보완하여 컴파일 시점이아닌, 런타임 시점에 프록시 클래스를 만들어주는 방식이 동적 프록시입니다. 그럼 동적 프록시는 어떻게 만들까요?? newProxyInstance() Java에서 ..