분류 전체보기(67)
-
Spring Boot + Keycloak server
기존 레퍼런스들은 WildFly에 의해 동작하는 Keycloak Server를 기준으로 동작한다. 그러나, 19.0.3 버전 이래로, WildFly는 keycloak server를 지원하지 않아 DEPRECATE 처리되었다. 그래서, Quarkus가 제공하는 keycloak server를 사용 해야하는데, GUI 구성부터, 애플리케이션 설정 및 빌드과정 까지 달라진 부분이 많아서, 해당 내용들을 종합하고 정리하여, 다음 작업때는 덜 헤메고자 한다. Requirements jdk 11+ (17 recommended) Index keycloak server 다운로드 keycloak bin configuration keycloak realms 생성 keycloak client 생성 keycloak client..
2022.10.24 -
팩토리 메소드 패턴
팩토리 메소드 패턴이란, 구체적인 인스턴스의 생성과정을 서브 클래스에게 맡기는 패턴을 의미한다. 다양한 구현체가 있을 경우, 특정한 구현체를 만들 수 있는 팩토리, 즉 creator를 제공하는 메소드를 구현하는 것을 팩토리 메소드 패턴이라 할 수 있다. 이펙티브 자바를 읽어본 사람은 헷갈릴 수 있지만, 이 패턴은 정적 팩토리 메소드와는 전혀 다른 개념이다. 팩토리 메소드 패턴은 인스턴스의 생성 과정을 서브 클래스에게 위임하는 패턴을 정의하고 있고 정적 팩토리 메소드는 인스턴스 생성 자체를 좀 더 효율적으로(네이밍을 통한 가시성 확보 및, 불필요한 중복 인스턴스 생성 방지 등) 개선해보고자 하는 일종의 코드 방법론을 정의하고 있다. 팩토리 메소드 패턴에 대한 특징은 우선 코드를 보면서 이야기를 해보자 예제..
2022.10.11 -
싱글톤 패턴 -1- 예외 상황과 해결법
저번 게시글에서는 싱글톤 패턴에 대한 정의와 코드 구현법에 대한 이야기를 해보았다. 그런데, Java에서는 싱글톤으로 생성한 객체를 어떻게 활용하느냐에 따라, 싱글톤을 보장하지 못하는 경우가 있다고 한다. 이번 게시글에서는 싱글톤을 보장하지 못하는 경우와, 그 경우에 대한 대처법에 대해 정리해보고자 한다. 싱글톤 적용이 안되는 케이스 1 Reflection 우선 싱글톤 예제 코드를 하나 정리보도록 하자 LazyHolderSingleton public class LazyHolderSingleton implements Serializable { priate LazyHolderSingleton() {} public static class LazyHolder { private static final LazyHo..
2022.10.11 -
작업일지#15 그 동안의 회고 및 앞으로의 계획
회고 마지막으로 작업일지를 작성하고, 약 5개월이 지났다. 원래 코딩하는 것 자체를 좋아했기 때문에, 분명 회사에서 코딩을 하더라도, 집에서도 코딩할 체력이 남아있을거라고 생각했다. 그런데.. 생각보다 힘이 부친다. 출/퇴근 거리가 왕복 3시간 정도 걸리고, 취준 막바지까지 운동을 거의 하지 않아, 체력도 저질이 되어, 일끝나고 퇴근하고 방에 들어오면, 컴퓨터 책상보다는 침대에 눈이간다... 개발자는 평생 공부해야하는 직업인데, 이런식이면, 코딩은 커녕 기술 서적 1페이지 읽지도 못하는 날이 쌓여만 갈 것이다. 그래서 대책을 세워봤다.. **1. 출 퇴근 시간을 활용하기** 생각보다 회사와의 거리가 멀어서 가만히 서있는 시간이 길다. 이 시간을 허투루 쓰지 않기 위해, 항상 기술 서적을 가방에 한권 씩 ..
2022.09.02 -
상속은 결합을 늘린다..?
'실용주의 프로그래머'를 읽던 중, 결합도에 관한 이야기를 일게 되었다. 그중에서 인상 깊었던 점은, '상속은 결합을 늘린다'라는 항목을 보게 되었다. 처음엔 조금 의아했지만, 몇몇 국내 자바 기본서에는 확장(extends)을 상속이라고 정의하는 경우가 종종 있다는 점을 생각해보면, 클래스의 확장(extends)과 인터페이스의 주입(implements)을 구분해서 생각하는 게 좋을 것 같다. 따라서, 같은 기능을 하는 코드를 추상 클래스와 인터페이스를 활용한 예제를 통해, '상속세' 개념을 활용해보면 좋을 것 같다. 0. 예제 준비 추상 클래스나, 인터페이스로 추상화할 기능은 다음과 같다. 인삿말을 빌드하는 메서드 인사말을 출력하는 메서드 이 두 기능을 2가지 방식으로 추상화하여, 그 차이를 파악해보자...
2022.08.27 -
RabbitMQ - @RabbitListener를 사용할 때 주의할 점
RabbitMQ는 amqp 0-9-1이라는 생산자, 소비자 패턴을 기반으로 한 메시지 큐 통신을 중계해주는 일종의 메시지 브로커이다. 초기에는 RabbitMQ를 사용할 땐 수동으로 설정해줘야 하는 부분이 많았다. 하지만, 세월이 흐르면서 스프링 진영에서, RabbitMQ, JMS를 비롯한 amqp 기반의 오픈소스를 직관적으로 사용할 수 있게, 추상화를 잘해주어서, 지금은 모든 걸 알지 않아도, amqp 기반의 메시지 통신을 사용하는데 필요한 러닝 커브를 매우 줄여준다. 하지만, 이러한 편리함에 익숙해져서, 사용법만 익혀둔다면, 나중에 디버깅을 할 때 매우 헤맬 수 있다. 이번 게시글에서는 그러한 요소들 중에서 @RabbitListener를 사용하여, 메시지를 소비하는 기능을 구현할 때 조심해야할 점을 짚..
2022.07.17