private 생성자나 열거 타입으로 싱글톤임을 보장하라

함수와 같은 무상태 객체나 설계상 유일해야 하는 컴포넌트처럼 인스턴스를 오직 하나만 생성할 수 있는(생성해야만 하는) 클래스를 싱글톤 객체라고 한다.자세한 싱글톤 클래스를 구현하는 방법은 이곳을 참조하기 바란다.클래스를 싱글톤으로 작성했을 경우의 문제점은 무엇인가 생각

2022년 5월 17일
·
0개의 댓글

Multiple DataSource 적용하기

스프링 부트와 스프링 JPA를 활용해서 여러 DataSource의 환경을 설정하는 방법을 알아본다.스프링 부트 프로젝트를 생성하고, 구성에 필요한 디펜던시와 여러 DataSource를 사용하기 위해 필요한 환경 설정 파일을 생성한다. 학교와 관련된 정보를 저장하는 sc

2022년 5월 15일
·
0개의 댓글

AbstractRoutingDataSource 적용하기

스프링 부트와 JPA를 활용해서 AbstractRoutingDataSource를 적용해보도록 하자. AbstractRoutingDataSource은 DataSource를 구현한 클래스로써 lookup key 기반으로 동적으로 타겟 DataSource를 변경할 수 있도록

2022년 5월 15일
·
0개의 댓글

SOLID 원칙

클래스는 하나의 책임만 가져야 하고 클래스의 모든 기능은 그 책임을 수행하는데 집중되어야 한다는 원칙이다. 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야함을 의미한다. 하나의 클래스가 여러 원인에 의해서 변경이 잦다면 각 책임을 별도의 클래스로 분할

2022년 5월 9일
·
0개의 댓글

프록시 패턴

클라이언트 코드가 곧바로 타겟 객체의 메소드를 호출하는 것이 아니라 프록시 객체를 통해서 타겟 객체의 메소드를 호출하는 것이다. 프록시는 대리인이라는 뜻인데 대리인을 통해서 요청을 하는 구조라고 할 수 있다. 프록시 패턴을 사용해서 타겟 객체의 메소드를 호출하기 전에

2022년 4월 27일
·
0개의 댓글

어댑터 패턴

기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴으로 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.위의 클래스 다이어그램에서 구현해야할 부분은 바로 Adapter이다. 타겟 인터페이스에 의존하고

2022년 4월 27일
·
0개의 댓글

세마포어와 뮤택스

세마포어는 여러 프로세스들의 공유 자원에 대한 접근 제어와 동기화를 지원하기 위한 정수로 선언된 동기화 도구이다.

2022년 4월 13일
·
0개의 댓글

생성자에 매개변수가 많으면 빌더 패턴을 고려하라

생성자, 정적 팩토리 메소드를 사용해서 객체를 생성할 때 선택적 매개변수가 많은 경우는 어떻게 할까?필수 매개변수를 갖는 생성자, 선택적 매개변수 1개, 2개, 3개 ..... 형태로 생성자를 오버로딩하는 방식이다.이러한 방식은 설정하기 원치 않는 매개변수까지 설정해줘

2022년 4월 12일
·
0개의 댓글

생성자대신 정적 팩토리 메소드를 고려하라.

생성자는 클래스와 이름이 같아야한다는 제약조건때문에 객체의 특성을 제대로 설명할 수 없다. 매개변수의 갯수와 타입으로 특성을 설명하기에는 무리가 있다.정적 팩토리 메소드는 이름 자체로 객체의 특성을 나타낼 수 있다는 장점이 있다.불변 클래스의 경우 객체를 미리 만들어놓

2022년 4월 12일
·
0개의 댓글

List

리스트는 요소의 중복을 허용하며 순서를 유지하는 자료구조이다.ArrayList는 0부터 시작하는 인덱스 값으로 구별되는 자료구조이다.ArrayList의 각각의 요소들은 다른 요소의 오른쪽에 연속적으로 저장된다.ArrayList의 첫 번째 주소 값과 인덱스 값을 통해 특

2022년 4월 12일
·
0개의 댓글

정적 바인딩과 동적 바인딩

바인딩(binding)이란 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위를 의미합니다.예를 들어 함수를 호출하는 부분에서 실제 함수가 위치한 메모리를 연결하는 것도 바로 바인딩입니다.출처compile-time에 발생하고, Runtime 시간 동안

2022년 4월 12일
·
0개의 댓글

바이트 코드와 머신 코드

머신 코드는 CPU가 직접 실행할 수 있는 이진 코드이고, 바이트 코드는 컴파일러에 의해서 생성된 중간 단계의 코드라고 할 수 있다. Java에서 바이트 코드는 JVM에서 실행되고 JVM의 JIT 컴파일러는 바이트 코드를 머신 코드로 변환하는 역할을 담당한다.머신 코드

2022년 4월 12일
·
0개의 댓글

싱글톤 인스턴스

클래스가 JVM으로 로딩될 때 최초 한번 생성하는 방식이다.이 방법은 싱글톤 객체를 생성하는 리소스 비용이 적을 때 사용하는 것이 바람직하다. 만약, 어플리케이션에서 해당 객체를 사용하지 않는데도 불구하고 무조건 싱글톤 객체를 생성하기 때문이다.그리고 이러한 방식은 객

2022년 4월 12일
·
0개의 댓글

LinkedHashMap으로 LRU 구현하기

LinkedHashMap은 두 개의 ordering mode를 지원한다.Insertion-OrderMap에 저장된 순서대로 엔트리의 순서를 유지하는 방식이다. 기본 생성자를 통해 LHM을 생성했을 경우에 해당한다.Map에 저장한 순서대로 엔트리가 출력되는 것을 볼 수

2022년 4월 11일
·
0개의 댓글

Stack의 문제점은 무엇일까?

Vector를 상속받고 있다.Stack은 Last In First Out 자료구조인데, Vector를 상속받았기 때문에 인덱스 기반으로 요소에 접근하거나 추가할 수 있다.위처럼 Vector 클래스를 상속했기 때문에 인덱스 기반의 연산이 가능해지므로 LIFO 자료구조의

2022년 4월 11일
·
0개의 댓글

HashTable과 HashMap 그리고 ConcurrentHashMap

Thread-SafeHashTable은 thread-safe 하기때문에 멀티스레드 환경에서 사용할 수 있지만 HashMap은 그렇지 않다.Collections.synchornizedMap(HashMap)을 사용해서 HashMap에 래핑 작업(?)을 거쳐 thread-s

2022년 4월 11일
·
0개의 댓글

HashMap

key와 value 형태로 저장하는 자료구조이다.key에 대한 해시 값에 해당하는 버킷에 Entry(key, value) 값을 저장한다.해시 함수는 key 값을 해시 테이블의 인덱스(버킷) 값으로 변환한다.해시 함수가 key 값을 해시 테이블의 인덱스 값으로 변환하기

2022년 4월 11일
·
0개의 댓글

equals, hashCode와 HashMap의 관계

객체의 주소 값이 달라도 객체의 값이 같으면 같은 객체로 판단하는 것을 동등성이라고 한다.즉, Person 타입의 인스턴스 p1, p2가 있을 때 객체가 가지고 있는 값이 같은 경우 동등한 인스턴스라고 한다.p1과 p2가 new 연산자를 통해 서로 다른 인스턴스를 생성

2022년 4월 11일
·
0개의 댓글

Bean Validation의 예외를 어떻게 처리할까

OrderItem 객체의 유효성 검사 1) price 필드는 1000이상의 값을 갖는다. 2) quantity 필드는 1~1000 사이의 값을 갖는다. 3) 주문 총액(price \* quantity)는 2만원 이상이어야 한다. 스프링에서 유효성 검사를 자동으로 해주고

2022년 4월 11일
·
0개의 댓글