본문 바로가기

분류 전체보기184

[Java] 참조 참조란? 참조란 객체나 변수가 메모리를 생성하지 않고 기존에 존재하는 메모리에 접근하는 것이다. 참조의 종류 강한 참조(String Reference) Object o = new Object(); 강한 참조를 통해 참조되고 있는 객체는 가비지 컬렉션의 대상에서 제외된다. new로 생성된 객체, 네이티브 피어, Queue / Stack처럼 스스로 메모리를 관리하는 객체 등... GC의 대상이 되도록 한다. o = null; 소프트 참조(Weak Reference) MyClass ref = new MyClass(); SoftReference softRef = new SoftReference(ref); JVM의 메모리가 부족한 경우에만 힙영역에서 제거되고 메모리가 부족하지 않다면 굳이 제거하지 않습니다. 대상.. 2022. 6. 5.
객체 생성과 파괴 불팔요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기 보다는 하나를 사용해서 재 사용 하는 것이 성능면에서나 메모리 관리면에서 더 좋다. String s = new String("bikini"); // 잘못된 사용 String s = "bikini"; // 옳은 사용 위에 코드처럼 작성하게 되면 반복문일 경우 객체가 계속해서 생성된다. 책에서도 Boolean(String)을 쓰지말고, Boolean.valueOf(String)을 사용하라고 나와 있다. @HotSpotIntrinsicCandidate public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } java코드를 보면 static으로 하나의 메서드만 생성해서 사용하도.. 2022. 6. 1.
객체 생성과 파괴 인스턴스화를 막으려거든 private 생성자를 사용하라. 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때 private 생성자를 사용해서 사용하지 않도록 명시하자. public class UtilityClass { private UtilityClass() { throw new AssertionError() } } 혹시나 내부에서 사용 할 수도 있기 때문에 AssertionError()를 던져주자. 장점 1. 상속을 막아준다. 2. 사용하지 말라는 표현이 명백하다. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 아래 코드들은 final로 인해 유연하지 못하다. 반드시 하나의 객체만을 사용한다는 가정이 없이는 사용하기 어렵고 final제거 한 후 교체하는 방식도 어색하며 오류를 내구 쉽다.. 2022. 6. 1.
폼 로그인 로그인 하기 스프링 프레임워크에서 로그인을 한다는 것은 authenticated 가 true인 Authentication 객체를 SecurityContext 에 갖고 있는 상태이다. (단, Authentication이 AnonymousAuthenticationToken 만 아니면 된다.) 로그인 == Authentication(authenticated = true) only if Authentication != AnonymousAuthenticationToken Authentication (인증)의 기본 구조 인증 토큰(Authentication)을 제공하는 필터들 UsernamePasswordAuthenticationFilter : 폼 로그인 -> UsernamePasswordAuthentication.. 2022. 5. 30.
SpringSecurity구조 Spring Security 큰 그림 톰켓과 같은 웹 애플리케이션을 서블릿 컨테이너라고 부르는데, 이런 웹 애플리케이션(J2EE Application)은 기본적으로 필터와 서블릿으로 구성되어 있습니다. 모든 Request들은 모든 필터를 차례대로 거친 다음 Servlet에 도착하게 된다. DelegatingFilterProxy 필터체인은 반드시 한개 이상이고, url패턴에 따라 적용되는 필터체인을 다르게 할 수 있다. 위 그림 처럼 /api/하위 FilterChain과 /admin/하위 FilterChain이 다를 수 있다. 만약에 공유하고 있다면 모든 FilterChain을 통과해야 하는 단점이 생긴다. proxy가 메인 필터 체인에 있고, proxy 하위에 SecurityFilterChain그룹을 등.. 2022. 5. 30.
Spring Security Spring Security 웹사이트는 각종 서비스를 하기 위한 리소스와 서비스를 사용하는 유저들의 개인 정보를 가지고 있다. 이들 리소스를 보호하기 위해서 일반적으로 웹 사이트는 두가지 보안 정책을 설정해야 합니다. 1. 서버 리소스 2. 유저들의 개인정보 이러한 개인정보를 보호하기 위해 개발자를 서포트 해주는 것이 Spring Security다. 관심을 가지고 있는 것은 2가지 이다. 인증 : 사용자가 누구인지 권한 : 어떤 권한을 가지고 있는지 인증(Authentication) 싸이트에 접근하는 사람이 누구인지 시스템이 알아야 한다. 익명사용자를 허용하는 경우도 있지만, 특정 리소스에 접근하거나 개인화된 사용성을 보장 받기 위해서는 반드시 로그인하는 과정이 필요하다. 로그인은 보통 username .. 2022. 5. 30.
Entity 영속성 컨텍스트 영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 캐시 Request가 와서 데이터를 조회 할 때 Key로 조회한다면 1차캐시를 먼저 찾지만 Key가 아니면 DB에서 새로 조회한다. 1차 캐시에 존재한다면 데이터를 불러오고 없다면 DB를 새로 조회한다. Entity 생명주기 비영속(new/transient) 엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속(new/transient)라 한다. @Autowired @Transient private Use.. 2022. 5. 29.
MVC Pattern MVC란 MVC는 Model, View, Contorller의 약자이다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성 요소를 세 가지의 역할로 구분한 패턴이다. 위 그림에서 USER가 이벤트를 발생 시키면 CONTROLLER가 MODEL을 통해 데이터를 가지고 온다. 그 결과물을 VIEW에서 받아 USER에서 전달하게 되는 형식이다. 모델(Model) DATA, 정보, 초기 값, 변수, 상수 또는 데이터를 가공하는 컴포넌트 등을 뜻한다. 모델의 규칙 1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다. 2. 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다. 3. 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 한다. - 변경 통지를 CONTROLLER에게 해야 한다. .. 2022. 5. 23.
객체 생성과 파괴 생성자에 매개변수가 많다면 빌더를 고려하라. 책에서는 빌더 패턴 전 시기에 2가지를 설명하고 있지만 결론은 builder를 사용하라는 것이기 때문에 builder에 대해서만 정리하였다. 빌더 패턴을 쓰면 장점 1. 빌더 패턴은 계층적으로 설계된 클래스와 함께 쓰기에 좋다. return 타입을 지정해서 child class에서 타입을 강제 반환 시킬 수 있다. 2. 가독성이 좋으며 build()에서 유효성 검사를 할 수 있다. private 생성자나 열거 타입으로 싱글턴임을 보증하라. public static 방식 public class Elvis() { public static final Elvis INSTANCE = new Elvis(); // 생성하지 못하도록 막는다. private Elvis() {.. 2022. 5. 22.
Visitor Pattern Visitor Pattern object구조의 요소들을 수행 할 operation을 나타낸다. Visitor는 요소 class의 변화없이 새로운 operation을 정의 할 수 있다. 위 그림은 Composite pattern에서 사용하였던 구조이다. 위와 같은 구조가 있을 때 각 요소에 대한 operation은 직접정의 할 수 있겠지만 공통된 operation은 visitor pattern내에 정의하여 사용 할 수 있다. 코드의 재사용성이 올라가며 추가적인 operation이 필요할 때 모든 요소들에 추가하는 것이 아니라 visitor에 추가하면 되기 때문에 유지보수에도 용이하다. solution object구조의 요소들을 대신 수행 할 Visitor object를 정의한다. 이 object는 요소들을.. 2022. 5. 22.
Template Method Pattern Template Method Pattern 알고리즘에서 특정 step만을 수정할 때 사용한다. subclass의 operation을 바꾸고 싶을 때 parent class에서 상속받아 재정의 한다. 하지만 이것은 전체를 다시 다 정의해야 하며 특정 부분만을 수정하는 것이 불가능하다. template method는 불변하는 코드와 변하는 코드를 나눠 불변하는 코드의 중복을 없애는 방법이다. Solution 변하는 코드를 함수(primitive)로 바꾸어 subclass에서 상속하여 변경시킨다. 반면에 불변 코드는 상위 클래스에 그대로 둔다. Motor public abstract class Motor { protected Door door; private MotorStatus motorStatus; pub.. 2022. 5. 22.
Strategy Pattern Strategy Pattern 알고리즘의 family를 정의하고 캡슐화한다. 또한 서로 상호교환도 가능하다. Strategy Pattern은 알고리즘을 독립적으로 다양하게 사용 할 수 있게 한다. 어떻게 알고리즘을 직접 구현하는 대신에 run-time에 환경설정을 할 수 있을까? 어떻게 알고리즘을 run-time에 교환하거나 선택할 수 있을까? Context내에 알고리즘을 switch나 if-else문으로 작성한다면 나중에 독립적으로 수정하기가 어렵다. 또한, 클래스가 복잡해지고 재사용성이 어려워진다. 알고리즘을 개발기간동안 확장되어지고 최적화되며 대체되기도 하기 때문에 결합을 약하게 해야만 한다. Solution 이 패턴의 목적은 상속을 통해 독립적으로 알고리즘을 구현하는데 있다. Strategy ob.. 2022. 5. 22.
State Pattern State Pattern internal state가 변경되었을 때 행위를 교체하는 것을 허용한다. internal state가 변경되었을 때 행동을 어떻게 교체할까? 어떻게 state기반 행동을 명시하고나서 새로운 state가 추가하거나 이미 존재하는 state의 행동을 독립적으로 변경할까? 주문 시스템에서 주문 Object가 있다고 하자. 이 주문을 취소하는 상태가 있을수도 있고, 취소했다가 재구매하는 상태 등 여러가지 상태가 존재 할 수 있다. State Pattern은 주문 or 상품에 대해서 독립적으로 state를 만들어 새로운 state가 필요하거나 operation을 독립적으로 교환 할 수 있도록 해준다. Solution Context와 State를 분리하고, State를 상속받아 State.. 2022. 5. 21.
Observer Pattern Observer Pattern object사이에 one-to-many 의존성을 정의하여 one object가 변경될 때 이것을 의존하고 있는 모든 object들을 자동적으로 업데이트 및 통지하는 것이다. 어떻게 one-to-many object들 사이에 의존성을 강한 결합없이 정의 할 수 있을까? 어떻게 one object가 many object에게 통지 할 수 있을까? 위 그림과 같이 수정이나 이벤트가 있을 경우 모두 등록된 object에게 자동적으로 수정 분을 공지하고 업데이트 하는 것이다. Solution Subject는 Observer의 container를 가지고 있으며, Observer를 추가하고 업데이트 하는 함수를 갖는다. public abstract class Subject { privat.. 2022. 5. 21.
Memento Pattern Memento Pattern 캡슐화를 위배하지 않고, object의 내부 state를 외부화하고 캡쳐해서 나중에 재사용하기 위해 사용한다. checkpoint나 undo를 구현하는데 용이하다. object의 데이터 구조나 구현은 object내에 숨겨져 있고 보이지 않고 object 외부에서 접근할수도 없다. 문제점은 internal state를 object의 외부로스터 접근 없이 외부로 저장시키는 것이다. memento pattern은 internal state의 스냅샷을 저장해서 나중에 state를 재사용 할수 있도록 한다. 동시에 캡슐화는 위배하지 않는다. * internal state : 모든 내부 데이터와 변수들 Solution Originator는 Memento의 현재 상태를 가지고 있는 객체이.. 2022. 5. 21.
Mediator Pattern Mediator Pattern 서로를 참조하고 있는 object들의 결합을 끊고 상호작용 할 수 있게 만드는 방법이다. 서로를 참조하고 있는 object들의 결합을 끊을 수 있을까? 어떻게 독립적으로 이러한 object들을 사호작용 할 수 있도록 할까? 이렇게 서로를 참조하여 강한 결합이 있는 obejct들은 독립적으로 수정, 구현, 재사용이 어렵다. solution Colleague1이 변할 때마다 자기 자신(this)를 Mediator1에 넘겨준다. public class Colleague1 implements Colleague { private Mediator mediate; private String state; public Colleague1(Mediator mediate) { this.medi.. 2022. 5. 15.
Iterator Pattern Iterator Pattern aggregate object의 내부를 알지 못해도 요소들을 접근 하는 방법이다. 어떻게 object의 내부를 표출시키지 않고 요소들을 접근할 수 있을까? aggregate object란 array, set같은 object를 이야기 한다. 이러한 object의 요소들을 접근하기 위해 내부를 노출시킨다면 캡슐화에 위배된다. solution Aggregate와 Iterator를 분리하여 Aggregate내에 Iterator를 내부 클래스로 구현한다. 왜 분리해서 구현해야 할까? aggregate object와 독립적으로 새로운 operation을 추가하기가 어렵다. 또, 요소를 탐색하는데 여러가지 iterator를 둘 수 없다. public class Aggregate1 imp.. 2022. 5. 15.
Interpreter Pattern Interpreter Pattern 자연어에서 문법에 따라 문장을 해석하는 역할을 한다. 문법은 언어의 구조를 표현하는 방법을 의미한다. Interpreter는 언어의 문장을 통역하는 규칙의 리스트를 가지고 있다. 언어의 모든 문장은 abstract syntax tree(AST)를 통해 class들을 instance하고 있다. Solution 1. Expression class hierarchy구조로 문법을 정의한다. - expression을 해석할 수 있는 interface를 정의한다. public abstract class AbstractExpression { private String name; public AbstractExpression(String name) { this.name = name;.. 2022. 5. 14.
Command Pattern Command Pattern request를 object로 캡슐화 한 다음 캡슐화된 object를 다른 요청이나 큐 등 다른 operation의 파라미터로 사용하게 하는 것이다. request의 요청자와 요청간의 결합을 어떻게 회피 할 수 있을까? 어떻게 특정 object를 request의 환경이 될 수 있도록 할까? compile-time에 request의 요청자와 특정 request를 결합시켜버린다면 run-time에는 request를 명시하는 것이 어렵다. 특정 operation을 명시하고 싶을 때 하드코딩을 회피해야 한다. 그렇게 한다면 compile-time과 run-time에 요청 처리에 대한 변화를 주기 쉬워진다. Solution Receiver1은 Reuqest, Command는 Recie.. 2022. 5. 12.
Chain Of Responsibility Pattern Chain Of Responsibility Pattern request가 있을 때 request를 다룰 수 있는 기회를 특정 object에게 준다. 이러한 object가 연결되어 있는 chain에 reuqest를 넣고, object들이 이 request를 다룰 때마다 chain을 통과하는 방식을 사용한다. 어떻게 request의 송신자와 수신자가 서로 의존하게 되는 것을 막을 수 있을까? 어떻게 request를 여러 object를 통하여 처리 할 수 있을까? 위 그림처럼 Receiver object들을 여러개 묶어 chain으로 만들어 놓고 요청에 대해서 각 처리하도록 한다. Solution Handler를 다룰 수 있도록 상속받은 Receiver class를 만든다. public class Receiv.. 2022. 5. 10.
객체 생성과 파괴 생성자 대신 정적 팩터리 메서드를 고려하라. 정적 팩토리의 장점 이름을 가질 수 있다. 생성자의 이름으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 반면 정적 팩토리 메서드는 특징을 묘사하게 할 수 있다. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 불변 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다. 또한, 인스턴스 통제 클래스를 통해 어느 인스턴스를 살아있게 할지 철저히 통제 할 수 있다. 인스턴스 통제 클래스는 Flyweight Pattern을 기반으로 되어있다. 어떤 인스턴스는 싱글톤으로 만들 수 있고, 다른 것은 인스턴스화 불가로도 만들 수 있다. 반환 타입이 하위 타입 객체를 반환 할 수 있는 능력이 .. 2022. 5. 9.
Flyweight Pattern Flyweight Pattern Flyweight Pattern은 미세하게 나누어진 매우 많은 object들을 효율적으로 공유하는 것이다. 미세하게 많은 양으로 나누어진 object를 어떻게 효율적으로 지원할까? 어떻게 많은 양의 object를 생성하는 것을 회피하면서 공유 할 수 있을까? 어떻게 object들을 물리적으로 적은 양으로 생성하면서 논리적으로 문제가 없게 object들을 표현할 수 있을까? 많은 object들을 다루기 위한 기본적인 방법은 필요한 만큼 object들을 생성하는 것이다. 이러한 방법은 많은 메모리를 차지하고 overhead를 일으킬 수 있다. 이것들을 해결하기 위해서는 물리적으로 생성되는 object의 수를 줄여야 하면서 논리적으로도 모든 객체가 존재해야만 한다. soluti.. 2022. 5. 9.
Facade Pattern Facade Pattern subsystem에 있는 여러 interface를 통합으로 묶어 줄 수 있는 interface를 정의하는 것이다. Facade는 subsystem을 쉽게 할 수 있도록 도와주는 higher-level interface를 정의하는 것이다. 복잡한 subsystem에 단순한 interface를 어떻게 제공 할 수 있을까? subsystem에 client와 object사이에 응집도를 어떻게 줄일 수 있을까? subsystem의 Client는 오직 Facade interface에 대해서만 알고 참조해야만 한다. 또, subsystem에 있는 서로 다른 interface에 대해서 독립적이게 하여 의존을 줄이고 client가 쉽게 구현, 수정, 테스트 그리고 재사용 하기 쉽게 한다. 왼쪽.. 2022. 5. 9.
Decorator Pattern Decorator Pattern 추가적인 기능을 object에 유동적으로 부여하는 것이다. subclassing이나 상속의 유동적 대안책으로 사용된다. 어떻게 object에 추가적인 책임을 유동적으로 부여 할 수 있을까? 어떻게 object의 기능을 run-time에 확장시킬 수 있을까? 이 Pattern은 상속처럼 compile-time에 클래스의 기능을 확장하는 것을 회피하기 위해서 사용된다. 예를 들어 web application에서는 버튼이나 스크롤의 이벤트에 따라 기능이 추가될 수도 있다. 이럴 경우 run-time에 기능을 추가하는 것이 필요한데 Decorator Pattern으로 해결이 가능하다. Solution Component에 기본적인 함수를 정의를 해놓고 Component를 상속받는다.. 2022. 5. 8.
Composite Pattern Composite Pattern Composite는 Object를 tree구조로 표현하기 위해 사용한다. Composite는 Client가 object와 object의 구성품을 균일하게 다루게 한다. 어떻게 object를 tree구조로 구성할까? Composite object를 가지고 어떻게 subtree를 구성할까? Tree구조는 OOP syetem에서 매우 자주 사용하기 때문에 composite는 패턴은 유용하다. Tree구조는 Leaf Object와 Composite object로 구성되어 있다. Leaf Object는 Leaf Node와 같은 역할을 한다고 보면되고 Composite object는 중간 Node이라고 보면 된다. 그래서 Composite object는 children을 가질 수 있.. 2022. 5. 5.
JPA Programming ORM(Object Relational Mapping)이란? DB와 application간에 데이터 접근 및 조작을 하기 위해서 java object와 DB사이를 mapping해 줄 수 있는 layer가 필요하다. 이 다리 역할을 해주는 것이 Object Relational Mapping, ORM, 이다. Spring Framework는 JPA, Hibernate, DAO와 transaction을 통합하여 관리 할 수 있도록 지원해준다. Spring Framework의 장점 Easier testing. IoC접근은 Hibernate SessionFactory instances, JDBC DataSource instances, transaction managers, and mapped object의 설정과.. 2022. 5. 1.
Proxy Pattern Proxy Pattern Proxy Pattern은 다른 object를 통제 할 수 있는 대리자를 만드는 것이다. 어떻게 object에 접근하는 것을 통제 할까? object에 접근할 때, 추가적인 기능을 어떻게 제공할까? Solution Proxy는 RealSubject를 생성자로 받아 operation하게 한다. public class Proxy extends Subject{ private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public String operation() { return "Hello World from proxy and " + .. 2022. 4. 24.
Bridge Pattern Bridge Pattern abstraction과 implementation을 분리하여 이 2가지를 독립적으로 다양하게 할 수 있다. abtraction과 implementation을 어떻게 독립적으로 다양하게 할 것인가? 어떻게 implementation을 run-time에 선택하거나 교환할 수 있을까? 서버를 사용할 때, 여러개의 다른 하드웨어를 가진 환경이 존재 할 수 있다. application을 서로 다른 하드웨어 환경에 적절히 동작하기 위해서 필요 할 수 있다. Solution Abstraction을 통해 Implementor의 구현부를 사용 한다. 따라서, run-time에 implementor를 상속받은 클래스만 바꿔주면 되기 때문에 Abstraction과 implementation이 독립.. 2022. 4. 24.
Prototype Pattern Prototype Pattern Prototypical instance를 사용하여 create할 object의 종류를 명시해주고, prototype 복사하여 새로운 object를 생성한다. run-time에 생성할 어떤 object를 명시하여 생성할 것인가? 클래스를 어떻게 동적으로 instantiation할 것인가? prototype으로써 역할을 하기 위해서 object는 스스로를 copy할 수 있는 Prototype interface를 구현해야한다. Solution Prototype interface clone메서드를 정의하고 Product1에서 사용한다. Product1에서 clone을 통해 새로운 객체를 반환하도록 한다. public class Product1 implements Prototype.. 2022. 4. 23.
Factory Method Pattern Factory Method Pattern object를 생성하는 interface를 정의지만 instantiation할 클래스를 subclass에 위임하는 것이다. 어떤 class를 instantiation할지 subclass에서 결정하기 위해서는 object를 어떻게 생성해야 할까? 어떻게 instantiation를 subclass로 위임할 수 있을까? Creator클래스 내부에 object를 직접적으로 생성 할 수 있도록 한다. 이것은 Creator클래스가 특정 object를 승인해주고 이 클래스로부터 독립적으로 instantiation를 변경하는 것은 불가능하게 한다. solution 결합을 느슨하기 위해 Creator Interface를 상속받아 Creator1을 만들고 factoryMethod내.. 2022. 4. 10.