[디자인패턴] 빌더(Builder) 패턴의 개념, 예제, 장단점, 활용

1. 빌더(Builder) 패턴이란? 일반적으로 구조를 갖춘 큰 구조물을 건축, 구축하는 것을 build라고 한다 예를 들어 빌딩을 지을 때 지반다지기, 뼈대 만들기 등의 과정을 거치며 아래에서 위로 순차적으로 만들어간다. 복잡한 구조물을 단숨에 완성하기는 어렵기에, 구성하는 각 부분을 만들고 단계를 밟아가며 만들게 된다. Builder 패턴은 이처럼 구조를 가진 복잡한 인스턴스를 조립해 가는 패턴이다. 2. 빌더 패턴의 구조 빌더패턴 예제 클래스 다이어그램 Builder 역 - 인스턴스를 결정, 인스턴스 각 부분을 만드는 메서드를 정의. 예제에서는 Builder 클래스가 역할을 맡음 ConcreteBuilder 역 - 인터페이스를 구현, 실제 인스턴스 생성으로 호출되는 메서드가 여기에서 정의 TextBuilder, HTMLBuilder 클래스가 역할을 맡음 Director 역- Builder의 인터페이스를 사용하여 인스턴스 생성한다. Concrete Builder역에 의존하지 않으며, ConcreteBuilder에 상관없이 작동하도록 Builder의 메서드만 활용한다. 예제에서는 Director클래스가 역할을 맡음 3. 예제 빌더 패턴을 사용하여 문서 작성하는 프로그램을 구현해보자. ...

2024-07-29 · 4 분 · Jun Kang

[Spring] Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection, 데이터베이스 접속 에러

Amazon RDS and Amazon Aurora SSL/TLS 인증서를 업데이트 후 별다른 설정 변경을 하지 않았지만, 오랜만에 빌드하는 스프링부트 프로젝트의 데이터베이스 연결이 되지 않는 현상 발생하였다. [### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host “{host}”, user “{user}”, database “{database}”, no encryption ] RDS 인증서 업데이트 작업 후 SSL 요구설정이 활성화된 것으로, 해당 에러가 나며 접속이 안된다면 다음과 같이 조치할 수 있다. ...

2024-07-25 · 1 분 · Jun Kang

[PostgreSQL] SUBSTRING, SUBSTR, 문자열 자르기

PostgreSQL에서 문자열을 다루는 다양한 방법이 있다. 그중 문자열을 원하는 방식대로 자를 수 있는 함수들에 대해 알아보자. 먼저, 가장 많이 쓰이는 SUBSTRING, SUBSTR의 기본 사용 법 및 응용, 성능에 대해 알아보자. 1. Substring 기본 사용법 Substring과 Substr은 시작 위치(n), 길이(l)를 기준으로 문자열을 자를 수 있다. SELECT substring('문자열' FROM n FOR l); -- from, for 구문은 substring만 지원 SELECT substring('문자열', n, l); SELECT substr('문자열', n, l); 구문을 활용하여 PostgreSQL Tutorial 문자열에서 첫번째 위치인 P부터 10개의 문자열만을 추출하는 예제를 확인해 보면 동일한 결과를 확인할 수 있다. ...

2024-07-24 · 2 분 · Jun Kang

[이펙티브 자바] 10. equals는 일반 규약을 지켜 재정의하라

1. 개념 equals를 단순히 재정의 하는 것은 쉽지만 함정이 많다. 이번 장에서는 equals를 재정의 할 때 고려해야 하는 점과, 재정의가 완료된 후 확인해야 하는 부분들에 대해 다루고 있다. 2. equals를 재정의하는 경우와 재정의하지 말아야 하는 경우 2-1. equals를 재정의하지 말아야 할 경우 각 인스턴스가 본질적으로 고유한 값을 표현하는 클래스: 예를 들어, Thread 클래스는 각 인스턴스가 고유한 ID를 가지므로 equals를 재정의할 필요가 없다. 논리적 동치성 검사가 필요 없는 경우: 대부분의 경우 객체 식별성만 중요하며, 논리적 동치성은 필요하지 않을 수 있다. 상위 클래스에서 재정의한 equals가 하위 클래스에 적절한 경우: 상위 클래스에서 이미 equals를 적절히 구현했고, 이를 하위 클래스에서 그대로 사용해도 무방한 경우이다. 접근이 제한된 클래스: equals를 호출할 일이 없는 private이나 package-private 클래스일 경우, 재정의할 필요가 없다. 2-2. equals를 재정의해야 할 경우 논리적 동치성 비교가 필요한 경우: 객체의 내용이 같은지를 비교해야 할 때, 상위 클래스의 equals가 이를 충족시키지 않을 때 재정의가 필요하다. 3. equals 메서드의 규약 Object 기본 명세의 equals 메서드는 다음의 규약을 준수해야 한다: ...

2024-06-29 · 2 분 · Jun Kang

[GitHub] 민감한 정보 완전 삭제와 PR 히스토리 정리

GitHub 리포지토리에 보안정책에 위반되거나 민감한 정보를 실수로 업로드하는 경우가 있다. 해당 브랜치를 지우거나 커밋 히스토리를 밀어버려도 이미 머지된 Pull Request라면, 깃허브 UI의 closed request 탭에서 파일 히스토리를 확인하면 해당 내용이 그대로 남아 있어 별도의 조치가 필요하다. 1. 민감정보 파일 완전 삭제 (리포지토리 복제 및 재생성) 1-1. 기존 리포지토리 클론 및 민감 정보 제거 git clone --mirror https://github.com/username/repo.git cd repo.git # BFG Repo-Cleaner 다운로드 curl -L -o bfg.jar https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar # 민감한 파일 깃 히스토리에서 완전 제거 java -jar bfg.jar --delete-files 'test.properties(삭제파일명)' # Git Garbage Collection 수행 ( Git reflog를 만료 시키고, 쓰지 않는 객체 삭제 ) git reflog expire --expire=now --all git gc --prune=now --aggressive 1-2. 기존 리포지토리에 클린 된 히스토리 강제 푸시 git push --force --all git push --force --tags ...

2024-06-19 · 3 분 · Jun Kang