전체 글50 [Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 의존 객체 주입 (Dependency Injection)을 프레임 워크로 제공하는 Dagger, Guice, Spring 등 있는데 한국의 대부분 자바 개발자에게 친숙하게 다가오는 것은 스프링 프레임워크일 것이다. 스프링을 생각해보면 인터페이스 기반으로 클래스 레벨에서는 의존하지 않고 런타임 시 동적으로 주입받는 역할로 많이 사용되고 있다. 이처럼, 유연성을 확보하고 결합도를 낮춰 주는 등의 장점이 존재한다. 여기서 언급되는 정적 유틸리티 클래스, 싱글턴으로서 구현되면 위의 장점과 반대로 유연하지 못하고 결합도는 높아진다. 유일 객체로 사용된다고 하였을 때는 유연성에 대한 고려는 하지 않아도 되겠다. . 이를 해소하기 위해 final 필드 제거하고 메서드를 통한 다형성을 제공할 수 있지만 멀티 스레드 환.. 2023. 1. 9. 정적 유틸리티 클래스 (Static Utility Class) Item 4 에서 자바 진영에서 제공하는 유틸성 클래스를 언급했다. [Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 정적인 필드와 메서드를 담은 클래스의 구현은 객체 지향적인 사고는 아니자만, 공통점이 있는 메서드 혹은 팩터리들을 제공할 때 사용되기도 한다. 자바 진영에서 제공하는 기본 타입, 유틸성 be-study-record.tistory.com 외에도 Apache Commons의 StringUtils, IOUtils, FileUtils 등의 많은 유틸리티 클래스가 존재한다. 유틸리티 클래스는 자주 사용되는 공통 기능들을 제공한다. 이러한 공통기능을 자주 사용해 왔지만 이렇게 논쟁이 되고 있는지 몰랐다. https://stackoverflow.com/questions/33400.. 2023. 1. 9. [Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 정적인 필드와 메서드를 담은 클래스의 구현은 객체 지향적인 사고는 아니자만, 공통점이 있는 메서드 혹은 팩터리들을 제공할 때 사용되기도 한다. 자바 진영에서 제공하는 기본 타입, 유틸성 인터페이스 등이 있고, 이외로 final 클래스가 있다. 위 예시처럼 정적으로 선언한 만큼 인스턴스 생성하지 못하도록하는 설계 의도가 담겨 있다. 여기서 아이템 4의 제목의 의미가 나타난다. 설계 의도대로 인스턴스화를 막으려면, private 생성자를 선언하라는 것이다. 생성자를 선언하지 않으면, 기본 생성자가 컴파일 타임에 생성되기 때문이다. Private로 선언하여도 클래스 내부에서는 접근이 가능하기에 생성자 호출 시 Assertion Error 예외를 방생시켜 실수를 방지 할 수 있다. 또한 상속 관계에서 하위타입 .. 2023. 1. 9. SQL [Structured Query Language] 여러 DMBS의 DATA를 관리하기 위한 공통적인 Language DBMS [Data Base Management System] Persistence Data 즉, 비 휘발성 메모리 (HDD, USB)등의 데이터를 Java I/O를 통해 File에 Data를 통해 간단한 처리하는 것은 간단하지만, 대량의 Data 복잡한 Data들은 처리하기에 피곤할 뿐더러, FIle System으로 Data를 관리할 때 예를 들어 수십 명의 사용자가 동시에 회원 가입을 한다면 동기화 문제가 발생한다. ⇒ 이러한 정보를 관리해주는 시스템이다. 이번 과정에서는 DBMS의 공통적이고 표준화 된 사용법인 SQL에 대해서만 학습할 예정이다. RDBMS [Relational DBM.. 2023. 1. 9. JDBC [Java Database Connectivity] DBMS에 종속적인 개발이 아닌 java.sql.*에서 지원하는 Interface를 통해 .java와 data를 주고 받고, DBMS 제조사에서 제공해주는 OracleDriver(다운 받은Driver 경로.oracle.jdbc.driver.oracledriver)들을 통해 DBMS와 java.sql API의 Interface와 연결해준다 Third Part Library 인 JDBC java 이외의 프로그램을 사용하기 위한 API, 사용하기 위해서는 해당 프로그램에서 제공하는 .jar파일을 class path에 학습 시킴으로서 불러올 수 있게 해준다. 우리가 사용하는 DBMS는 Oracle에서 제공하는 10g Version을 이용한다. JDBC 절차 1.. 2023. 1. 9. Servlet & JSP Servlet & JSP를 접하기 전에 JAVA WEB 개발 환경 구축에 대해 먼저 살펴보겠다. WEB이란 가장 많이 사용하는 Client/Sever Program의 일종이다. ⇒ Client/Server는 누가 요구하고 응답을 주냐 에 따라 용도 상으로 결정된다. Client : Request하는 쪽 ex) JDBC Client Sever : Request에 대한 Response하는 쪽 ex) DBMS Server 💡 Client Sever의 개수에 따른 명칭 2개 ⇒ Two tier Architecture 3개 ⇒ Three tier Architecture 4개 이상 ⇒ n tier Architecture Client / Server Program의 3가지 요소 Unique한 Identifier ex.. 2023. 1. 9. 객체 지향 프로그래밍 OOP [Object - Oriental Programming] Real World를 System에서 표현하는 방법론이다. 가장 많이 사용되는 방법론이다. Object : Real World에 존재하는 물리적인, 개념적인 모든 것을 의미한다. Abstraction : Object들의 공통적인 state, attribute, behavior을 추출해 내는 과정을 의미하고, 어떤 System을 구현할 것 인가에 따라 추출해야 하는 infomation이 달라 문제 영역에 의존적이다. Class : Object들을 system에 Abstraction되어 나온 공통적인 부분을 모은 Filed(변하지 않는 state와 behavior로 인해 변하는 attribute, Method(behavior)로서 표현한 것을 iden.. 2023. 1. 9. 팩터리 패턴 (Factory Pattern) 팩토리 패턴이란 객체 생성을 위해 필요한 인터페이스를 만든 후, 인터페이스를 구현한 팩토리를 통해 어떤 객체를 만들지 결정하는 디자인 패턴이다. 종류 공통점 차이점 팩터리 메서드 패턴 객체의 생성부 캡슐화를 통해 낮은 결합도를 만들며 구체적인 타입에 의존하지 않도록 해준다. 상속을 통해 팩토리 메서드를 오버라이딩하여 생성부를 구현한다. 추상 팩토리 패턴 객체 집합을 생성하기 위한 정의를 추상객체에 위임하고 구현체에서 세부적인 집합 생성 과정을 구현한다. 팩토리 메서드 패턴 생성할 객체 타입을 예측할 수 없거나 객체 생성의 책임을 서브 클래스에게 위임하고 정보 은닉을 하고자 할때 사용된다. 장점 - 객체지향의 원칙 중 하나인 개방 폐쇄의 원칙에 의거할 수 있다. 즉, 확장에는 열려있고 변경에는 닫혀있다. .. 2023. 1. 9. [Item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴은 인스턴스를 오직 하나만 생성하여 재사용하는 클래스이며 무상태, 유일 객체이다. 인터페이스 정의 없이 클래스를 싱글턴으로 만들면 유일 객체이므로 비용 등이 고려 될 경우 테스트가 불가피해진다. 따라서, 인터페이스 정의 및 구현을 통해 Mock 객체 구현을 통해 테스트를 진행해야한다. mock 테스트 방식이 궁금하다면 하단 github 링크의 mock_test 예제 코드를 참고 바란다. 싱글턴 방식에는 필드, 정적 팩터리, 열거 타입 3가지로 볼 수 있다. 필드 방식 private 기본 생성자를 만들어 놓았기에 필드를 초기화 할 때 한번 호출되어 하나뿐임이 보장된다. 또한 API를 통해 싱글턴 클래스 임을 명확하게 드러낼 수 있고 방식이 간결하다. public class Person { public.. 2023. 1. 7. [Item 2] 생성자에 매개변수가 많다면 빌더를 고려하라 필수가 아닌 선택적인 매개변수가 많을때 정적 팩터리와 생성자로 대응하기 쉽지 않다는 점이다. 점층적 생성자 패턴 - 선택 값을 하나씩 추가하여 생성자를 점층적으로 만드는 패턴이다. 매개변수의 개수나 타입이 일치하지 않을 경우 컴파일 오류를 통해 누락된 값을 확인할 수 있는 안전성을 가지고 있다. 그러나, 적당한 개수의 매개변수에 대한 점층적 생성자 패턴은 괜찮아 보일지 몰라도 점점 많아지는 생성자로 클래스 코드의 추가 수정 삭제등 유지보수에 대한 불편함이 있다. 또한 각 생성자의 의미, 어떠한 매개변수가 들어가야 하는지에 대한 가독성이 떨어진다.. public class Jwt { private static final String SECRET_KEY = "1234"; // JWT Secret Key pr.. 2023. 1. 7. 브리지 패턴 (Bridge Pattern) 장점 - 기능 인터페이스와 구현을 담당하는 추상 클래스로 독립적으로 구성이 된다. - 각 계층을 독립적으로 확장 및 변경이 가능해진다. - 객체 간 결합도를 낮출 수 있다. - 기존 설계에 새로운 요소들을 지속적으로 추가할 때 유용하다. - 기존 코드 변경 없이 기능을 확장할 수 있다. 단점 - 계층 구조에 새로운 구현체 및 기능 등을 추가하다보면 설계가 복잡해질 수 있다. 설계 구조 필기구를 추상 클래스로 선언하여 색연필, 샤프 등으로 사용하고 작성의 기능을 분리하여 선, 원, 사각형 등의 기능을 정의한다. 예제 코드 필기구 추상 클래스 public abstract class Pencil { protected Writing writing; protected Pencil(Writing writing) {.. 2023. 1. 7. 플라이 웨이트 패턴 (Flyweight Pattern) 요청마다 매번 새로운 인스턴스를 생성하는 것이 아닌 동일한 속성을 가진 인스턴스를 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴이다. 예를 들어 무지개 색의 색연필이 있고 100명의 사용자가 각각 7원색을 모두 요청 하였다고 가정했을 때, 요청마다 새로운 인스턴스를 생성하게 되면 700개의 인스턴스가 생성되어야 한다. 그러나 플라이 웨이트 패턴을 이용하여 요청된 속성의 객체를 캐싱하여 동일한 속성을 요청하였을 경우 캐싱해둔 인스턴스를 반환함으로서 7개의 인스턴스로 처리 가능하다. 플라이 웨이트 패턴 구성 공유될 객체 객체의 인스턴스를 생성하고 캐싱하여 공유해주는 팩토리 예제 코드 색연필 클래스 /** * 길이와 무게 등은 고정값이라고 가정하고 진행한다. * 색만 변경한다. */ public .. 2023. 1. 7. 이전 1 2 3 4 5 다음