728x90

SPRING을 공부하면서 많이 듣던 개념 중 하나는 의존성 주입입니다.

개발자들은 정말 많이 들었지만 이 개념에 대해서 정확하게 알지 못하고 연차가 쌓이는 경우가 대부분입니다.

연차가 쌓일수록 코딩은 기초가 가장 중요하다고 생각합니다. 그래서 저 또한 의존성 주입에 대해 정확하게 알고 가기 위해서 이렇게 포스팅으로 정리하고자 합니다.

의존성 주입 DI(Dependency Injection) 개념

DI는 디자인 패턴 중 하나입니다. 객체 간의 의존성을 단순하게 외부에서 주입해서 사용한다는 의미이다.

실생활에서 예를 들어 설명하자면 우리는 로봇에 팔을 만드는 공장이 있다고 예시를 들어보겠습니다.

 

A 로봇은 3m짜리 팔이 필요하고, B 로봇은 6m짜리 팔이 필요하다고 생각했을 때

우리는 팔을 만드는 공장에 "3m의 팔이 필요해"라고만 전달해주면 3m짜리 팔을 만들 수 있습니다.

 

하지만 전체 로봇 공정 자체가 5m짜리의 팔의 로봇만 만들어진다고 생각했을 때는 3m짜리 팔을 만들 때는 그 전체 로봇 팔을 만드는 공장 프로세스 자체를 바꿔버려야 합니다. 그러므로 각기 다른 팔 길이의 로봇을 생산할 수가 없습니다.

 

의존성 주입이란 로봇을 만드는 공장에 팔을 만드는 공정만 의존성 주입을 하여 각기 다른 팔 길이 (3m, 5m 등)을 생성하여 다양한 로봇의 팔을 만들 수 있게끔 해줍니다.


의존성 주입 DI(Dependency Injection) 주입 방법

  • 생성자 주입
  • 필드 주입
  • Setter 주입

1. 생성자 주입

생성자를 통한 의존관계 주입 예제

예제와 같이 생성자는 생성자를 처음 생성할 때 1회 주입만 가능합니다.

객체의 주입을 해야지만 사용되는 프로그램이라면 강제로 주입을 할 경우에 사용됩니다.

하지만 기본적으로 Spring은 Autowired가 없어도 주입이 가능하도록 편의를 제공하고 있습니다.

 

2. 필드 주입

필드 주입 예제

필드 주입을 통해 단순하게 코드를 짜면 간결하게 짤 수가 있습니다.

하지만 외부에서 변경을 하고 싶어도 불가능하기 때문에 테스트 코드를 할 때 불편함이 있고, 또한 무조건 DI 프레임워크가 존재해야 되므로 점차 사장되는 중입니다. 

3. Setter 주입

Setter를 통한 주입은 주입받은 객체가 변경이 필요할 때 사용이 됩니다.

 

맺은 말

의존성 주입 DI(Dependency Injection)을 통해 우리는 코드를 간결하게 하여 직관성과 편리성을 얻을 수 있습니다. 또한 간단히 DI를 통해 테스트 코드 작성도 쉽게 할 수 있습니다.

우리가 많이 쓰는 spring에서 잘 지원하고 있기 때문에 생성자 주입을 적시적소에 사용한다면 좋은 코딩 편리한 코딩을 하시는데 도움이 되실 겁니다.

반응형
728x90

'디자인 패턴' 개발자를 살아가면서 많이 들어봤던 단어이지만 그에 따라서 이해하기가 정말 어려운 단어이기도 합니다. 

 

'디자인 패턴' 단순하게 이야기 하자면 '패턴' 이라는 말에 주목하면 된다. 지금까지 개발을 해왔던 사람들이 고심고심하여 만들어지고 만들어졌던 몇가지 일정한 패턴 중에 하나를 선택/개발하여 올바른 설계를 해라 라는 의도로 만들어진 패턴들을 '디자인 패턴' 이라고 합니다.

 

그렇다면 디자인 패턴에서는 3가지 구조로 나뉩니다.

 

1. Context

    문제발생 상황 기술 > 패턴이 적용될 상황 기술

     패턴은 상황에 맞게 써야 됨. 항상 유효하지 않는다.

2. Problem

    패턴 적용으로 해결되어야 할 디자인 이슈들을 기술

    여러 제약사항과 영향력도 문제 해결을 위해 고려

3. Solution

   문제를 해결하도록 설계를 구성하는 요소들과 그 요소들 사이의 관계, 책임, 협력 기술

   Solution은 구체적인 구현 방법 및 다양한 상황에 적용할 수 있는 템플릿

디자인 패턴

솔루션사업에서도 기존 솔루션을 가지며 그걸 토대로 커스터마이징으로 개발을 진행합니다. 마찬가지로 이미 오랜시간동안 여러 프로젝트에서 재사용 및 유효성은 입증이 되었으며 신뢰할 수 있는 솔루션 패턴이라고 생각하시면 됩니다.

 

디자인 패턴에는 총 3가지의 카테고리가 있습니다.

이들은 인스터스에 관한 생성, 구조화, 행동과 관련이 있습니다.

 

1. 생성 패턴 (Creational Pattern)

    - 객체 생성 Pattern으로 객체의 생성 및 조합을 캡슐화해 객체가 생성되거나 변경되어도 프로그램에 영향을 미치지 않게 하는 유연성을 제공하는 패턴

 

2. 구조 패턴 (Structural Pattern)

    - 클래스나 객체를 합성에 관해 더 큰 구조로 만드는 패턴입니다.

 

3. 행동 패턴 (Behavioral Pattern)

    - 객체나 클래스 사이에서 상호작용하는 방법과 책임을 분산하는 방법을 정의하는 패턴입니다.

 

생성 패턴 (Creational Pattern) 구조 패턴 (Structural Pattern) 행동 패턴 (Behavioral Pattern)
Singleton Adapter Command
Abstarct Factory Composite Interpreter
Factroy Method Decorator iterator
Builder Facade Mediator
protoType Flyweight Memento
  proxy Observer
    State
    Strategy
    Template Method

 

위에 표는 3가지 디자인 패턴의 카테고리에 종류에 대해서 정리한 표 입니다.

반응형
728x90

자바를 사용하시다 보면 우리가 모르는 많은 freamwork를 사용하게 될 것입니다.

알아야 보인다는 것 처럼 어떠한 장점이 있고 연차가 쌓였을 때 정확한 오더를 할 수 있을 것 입니다.

지금부터 알아볼 자바에서 제공하는 Collection Framework는 우리가 많이 사용하지만 정확한 개념을 모르는 것들을 소개하고자 합니다.

Collection framework 란?

DATA를 더 쉽게 더 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 즉 인터페이스의 집합을 의미합니다.

 

자 그렇다면 인터페이스에는 무엇이 있는지 살펴보도록 하겠습니다.

 

컬렉션 framework

위에 그림과 같이 인터페이스는 총개에서 파생됩니다.

 

1. List 인터페이스

2. Set 인터페이스

3. Map 인터페이스

 

위에 3가지 인터페이스는 아래 표로 간단히 정리를 해보았습니다.

 

인터페이스 설명 예시
List<E> - 순서가 있는 데이터의 집합.
- 데이터의 중복을 허용.
Vector, ArrayList, LinkedList, Stack, Queue 등
ex) 대기자 명단
Set<E> - 순서가 없는 데이터의 집합.
- 데이터의 중복을 허용하지 않음.
HashSet, TreeSet 등
ex) 양의 정수 집합, 소수의 집합
Map<K, V>

- 키(key)와 값(value)의 한 쌍(Pair)으로 이루어지는 데이터의 집합
- 순서가 없음.
- 키는 중복을 허용하지 않음
- 값은 중복 허용.

HashMap, TreeMap, Hashtable, Properties 등
ex) 우편번호, 지역번호(전화번호)

List

배열과 같이 순서가 있는 List 인터페이스는 객체들을 일렬로 늘어놓는 구조를 가지고 있습니다.

객체를 인덱스(순번을 매긴다)를 매겨 객체를 저장하여 검색/삭제 등을 할 수 있는 기능을 가지고 있습니다.

 

이 인덱스를 기준으로 각각의 객체는 Array를 가지고 있습니다. 그리하여 동일한(중복) 값을 참조하더라도 객체들은 값을 참조하는 게 아닌 그것에 있는 Array를 참조하여 값을 가지고 옵니다.

 

그러므로 다수의 사용자들이 동일한 값을 변경하려고 할 때 문제가 생기기도 합니다.

그래서 ArrayList의 경우는 Thread Safety하지 않다라고도 합니다.

 

하지만 여기서 Vertor는 Thread에서도 Safety 합니다.

이유는 Vertor는 synchronized가 되어 있어 들어온 순서대로 값을 변경하기에 Thread Safety 합니다.

 

그러므로 싱글 스레드 환경에서는 Vertor는 쓸데없이 synchronizd를 하기 때문에 성능면에서는 좋지 않아 쓰지 않는 것을 추천합니다.

Set

순서가 없는 데이터의 집합이고 데이터의 중복을 허용하지 않습니다.

Set은 ArrayList 대신에 iterator를 사용합니다.

LinkedList도 순서는 있지만 인데스가 없으므로 iterator를 사용합니다.

 

- HashSet

      빠른 접근 속도를 가지고 있음.

      순서를 모름.

      객체 중복 허용하지 않음.

 

Set <E> = new HashSet<E>();

      

- LinkedHashSet 

      추가된 순서대로 접근 가능

 

Set<E> = new LinkedHashSet<E>();

 

- TreeSet

      정렬방법을 지정하지 않음.

 

Set<E> = new TreeSet<E>();

Map

키(Key) 값(Value)의 한 쌍(Pair)으로 구성된 객체를 저장하는 구조를 가지고 있다.

키는 중복이 허용되지 않지만 값은 중복을 허용할 수가 있다.

기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 Replace 된다.

 

- HashMap

Map 인터페이스를 대표하는 Map Collection.

주로 Key는 String 타입을 사용하며, String이 문자열이 같을 경우 동등 객체로 사용되게 한다.

 

HashMap<String, String> hashMap = new HashMap<String, String>();

 

- TreeMap

이진트리를 기반으로 한 Map Collection

키와 값을 저장하는 동시에 키를 정렬합니다.

 

* 정렬되는 순서

1. 숫자

2. 알파벳 대문자

3. 알파벳 소문자

4. 한글

 

정렬을 해야 될 필요가 있다면 HashMap 보다는 TreeMap으로 사용하면 성능면에서 좋습니다.

 

TreeMap<String, String> treeMap = new TreeMap<String, String>();

 

 

 

반응형
728x90

static

 

static은 Java 개발자에게는 제일 익숙한 용어입니다.

그렇다면 static이란 무엇인지, 어떻게 Java에서 쓰이는지 설명하겠습니다.

 

Java에서 static 키워드를 사용한다는 것은 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때까지 그 메모리에 값이 유지된다는 것을 의미한다. 쉽게 설명하자면 특정한 값을 공유를 해야 하는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.

 

static에서 가장 중요한 키워드는 class입니다.

static class 란?

static class는 하나 이상의 static method를 가지고 있는것을 의미합니다.

 

static class 예시

 

public class Test {

        public static void String testtest() {

              System.out.println("TEST!!!!!!");

        }

}

 

그렇다면 static method는 어떻게 사용되는가?.

 

static 사용 예시

 

예시 1)

 

Test.testtest(); 

 

예시 2)

 

Test test111 = new Test();

test111.testtest();

 

예시1, 예시2에서 에러 나는 것은 예시2 입니다.

 

즉 결론을 말하자면 static 메소드를 사용하기 위해서는 예시1에서 처럼 class를 직접 불러와야만 사용이 가능하며

인스턴스에서는 사용을 할수가 없습니다.

 

 

 

 

 

 

 

반응형

+ Recent posts