no image
Selection_Sort(선택 정렬)
➡️Selection_Sort(선택 정렬)이란 Selection_Sort(선택 정렬)은 현재 위치에 들어갈 데이터를 찾아서 선택하는 알고리즘이다. 데이터를 비교하면서 찾기때문에 비교정렬이고 정렬의 대상이 되는 데이터 외에 추가적인 공간을 필요로 하지 않기 때문에 제자리 정렬이기도 하다. ➡️Selection_Sort(선택 정렬)의 과정 주어진 배열에서 최솟값을 찾는다. 최소값을 맨 앞자리의 값과 교환한다. 맨 앞 자리는 이미 최솟값이 있기때문에 맨 앞 자리를 제외하고 나머지 값들 중 최솟값을 찾아 위과정을 반복한다. ➡️Selection_Sort(선택 정렬) 장단점 장점 선택정렬 또한 버블정렬과 마찬가지로 구현이 쉬운편에 속하는 정렬법이다. 정렬을 위한 비교 횟수는 많지만 실제로 교환하는 횟수는 적기 때..
2021.06.29
no image
Bubble_Sort(거품 정렬)+JAVA로 구현
➡️Bubble_Sort란? 서로 인접한 두 원소를 검사하여 절영하는 알고리즘 Bubble_Sort는 데이터를 비교하면서 찾기 때문에 비교정렬이며 정렬의 대상이 되는 데이터 외에 추가적인 공간을 필요로 하지 않기 때문에 제자리 정렬이기도 하다 ➡️Bubble_Sort의 장단점 장점 메모리 소비가 적다. 구현이 비교적 쉬운편이다. 단점 교환 과정이 많아 시간이 많이 소요된다. Bubble_Sort의 평균 시간복잡도가 O(N^2)이다. 효율성이 떨어진다. ➡️Bubble_Sort의 과정 앞에서부터 현재 원소와 다음의 원소를 비교한다. 현재 원소가 다음 원소보다 크면 원소를 교환한다. 다음 원소로 이동하여 앞 과정을 반복한다. 위 과정은 아래 그림과 같다. 각 회전은 배열의 크기 -1만큼 진행된다. 각 회전별..
2021.06.28
no image
[Spring]다양한 의존관계 주입 방법
의존관계 주입은 크게 4가지 방법이 있다. 수정자 주입 (setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 👉수정자 주입(setter 주입) setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다. 선택,변경 가능성이 있는 의존관계에 사용한다. 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Component public class OrderServiceImpl implements OrderService{ private MemberRepository memberRepository; private DisCountPolicy discount..
2021.06.25
no image
[Spring]의존성 주입(Dependency Injection)
➡️의존성 주입이란 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법이다. 예를 들어 장난감,리모컨,휴대폰 모두 배터리를 교체 할 수 있는 제품이라면 장난감,리모컨,휴대폰 모두 배터리에 의존하기 때문에 배터리를 갈아끼우는 것을 의존성 주입이라고 보면 된다. 그러나 만약 장난감이나 휴대폰이 배터리 교체가 불가능한 일체형이라면 교체하지 못하고 새제품으로 바꿔야 하기때문에 설계로 본다면 유연하지 못한 설계가 된다. 밑에 예제를 보고 의존성 주입이 필요한 이유를 알아보자 1 2 3 public class Americano{ } cs 1 2 3 4 5 6 7 8 9 10 11 12 public class Cafe{ private Americano americano; pub..
2021.06.24
no image
[Spring]@RequiredArgsConstructor
@RequiredArgsConstructor 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용됩니다. 1 2 3 4 5 6 7 8 @Service @RequiredArgsConstructor public class RequiredArgsConstructorService{ private final OneRepository oneRepository; private final TwoRepository twoRepository; private final ThreeRepository threeRepository; } Colored by Color Scripter cs 위 ..
2021.06.23
no image
JPA(Java Persistence API)란?
💻JPA란? 자바 퍼시스턴스 API또는 자바 지속성 API(Java Persistence API, JPA)는 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다. 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다. 실제로 동작하는 것은 아니다 JPA인터페이스를 구현한 대표적인 오픈소스가 Hibernate이다. 과거의 자바 표준은 EJB였다.그러나 EJB를 사용하면 코드가 매우 지저분하고 속도가 느리다는 단점을 가지고 있었다. 👉ORM ( Object-relational mapping (객체 관계 매핑))은객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다. ORM 프레임워크가 중간에서 매핑해주고 대..
2021.06.23
no image
[Network]HTTP와 HTTPS
📡HTTP란? HTTP는 HyperTextTransferProtocol의 약자로 하이퍼텍스트 문서를 교환하기 위하여 사용된 통신 규약이다. 웹 서버와 클라이언트 간의 통신을 하기 위한 통신 규약이다. HTTP는 1989년 팀 버너스 리에 의해 처음 설계되어 인터넷을 통한 월드 와이드 웹 기반에서 전 세계적인 정보 공유를 이루는데 큰 역할을 했다. HTTP는 웹에서만 사용하는 프로토콜로 TCP/IP기반으로 한 지점에서 다른지점(서버와 클라이언트)으로 요청과 응답을 전송한다. 📡HTTP의 특징 HTTP 메시지는 HTTP 서버와 HTTP 클라이언트에 의해서 해석이 된다. TCP/IP를 이용하는 응용 프로토콜(application protocol)입니다.HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜이다..
2021.06.21
no image
[Server]MSA(MicroService Architecture)란?
💻MSA란 애플리케이션 개발 초기에는 전체 애플리케이션의 소스 코드를 하나의 배포 유닛(war 또는 ear)으로 내장시키는 '모놀리식' 방식을 이용하였다. 하지만 기존 애플리케이션에 최소한의 변경 사항이 있어도 자체적인 QA(Quality Assurance) 주기에 따라 대규모 업데이트를 해야 하거나 일부 애플리케이션의 업데이트로 오류가 발생한 경우 전체를 오프라인으로 전환하고 문제를 해결하는 등 다운타임이 발생하게 되었다. 이러한 문제점을 해결하기 위해 전통적인 모놀리식(monolithic) 접근 방식과 다르게 애플리케이션을 핵심 기능으로 세분화하여 하는 MicroService(MS)라는 아키텍처 기반의 접근 방식이 탄생하게 되었다. 여기서 각 기능을 서비스라고 부르며, 독립적으로 구축하고 배포할 수 ..
2021.06.18
728x90

➡️Selection_Sort(선택 정렬)이란 

  • Selection_Sort(선택 정렬)은 현재 위치에 들어갈 데이터를 찾아서 선택하는 알고리즘이다.
  • 데이터를 비교하면서 찾기때문에 비교정렬이고 정렬의 대상이 되는 데이터 외에 추가적인 공간을 필요로 하지 않기 때문에 제자리 정렬이기도 하다.

 

https://gmlwjd9405.github.io/2018/05/06/algorithm-selection-sort.html

 

https://ko.wikipedia.org/wiki/선택_정렬

➡️Selection_Sort(선택 정렬)의 과정

  • 주어진 배열에서 최솟값을 찾는다.
  • 최소값을 맨 앞자리의 값과 교환한다.
  • 맨 앞 자리는 이미 최솟값이 있기때문에 맨 앞 자리를 제외하고 나머지 값들 중 최솟값을 찾아 위과정을 반복한다.

➡️Selection_Sort(선택 정렬) 장단점 

장점

  • 선택정렬 또한 버블정렬과 마찬가지로 구현이 쉬운편에 속하는 정렬법이다.
  • 정렬을 위한 비교 횟수는 많지만 실제로 교환하는 횟수는 적기 때문에 많은 교환이 일어나야 하는 자료상태에서 효율적으로 사용될 수 있다. 
  • 거품 정렬과 비교 했을 때, 똑같이 시간복잡도는 O(N^2)이지만, 구현해보면 버블 정렬보다는 빠른 편이다.

단점

  • 시간 복잡도가 O(N^2)이기 때문에 시간이 오래 소요된다.
  • 안정 정렬이 아니다.

 

➡️Selection_Sort(선택 정렬) 구현코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
public class SelectionSort {
  
    public static void selectionSort(int []arr){
     
        selection_sort(arr,arr.length);
    }
 
    private static void selection_sort(int [] arr,int size){
       
          for(int i =0; i< size-1; i++){
            
            int min_index = i;
 
            for(int j = i +1; j<size ; j++){
               
                 if(arr[j] < arr[min_index]){
                    
                         min_index = j;
                }
            }
 
            swap(arr,min_index,i);
        }
    }
    private static void swap(int []arr, int i ,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 
}
cs

 

아래는 위와는 살짝 다른 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
public class Selectionsort2 {
 
    public void selectionSort(int []arr){
        
        int size = arr.length;
        int temp;
        int min;
 
        for(int i=0; i<size -1; i++){
 
            min =i;
 
            for (int j = i+1; j<size; j++){
 
                if(arr[min]>arr[j]){
 
                    min = j;
 
                }
 
            }
 
            temp  = arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
 
        }
    }
 
    public static void main(String[] args) {
 
        Selectionsort2 s = new Selection_sort2(); 
 
        int arr[] = {4,7,8,9,1,4,2,5};
 
        s.selectionSort(arr);
 
        for (int i = 0; i<arr.length; i++){
 
            System.out.print(" " +arr[i]);
 
        }
    }
}
cs

REFERENCE

728x90

'Dev > 알고리즘 ,자료구조' 카테고리의 다른 글

[Algorithm]BeakJoon_1330  (0) 2021.07.18
Insertion_Sort(삽입 정렬)  (0) 2021.06.30
Bubble_Sort(거품 정렬)+JAVA로 구현  (0) 2021.06.28
스택(Stack) JAVA로 구현  (0) 2021.04.24
자료구조_배열(Array)  (0) 2021.03.11
728x90

 

➡️Bubble_Sort란?

  • 서로 인접한 두 원소를 검사하여 절영하는 알고리즘 
  • Bubble_Sort는 데이터를 비교하면서 찾기 때문에 비교정렬이며 정렬의 대상이 되는 데이터 외에 추가적인 공간을 필요로 하지 않기 때문에 제자리 정렬이기도 하다

 

➡️Bubble_Sort의 장단점 

장점

  • 메모리 소비가 적다.
  • 구현이 비교적 쉬운편이다.

단점

  • 교환 과정이 많아 시간이 많이 소요된다.
  • Bubble_Sort의 평균 시간복잡도가 O(N^2)이다. 효율성이 떨어진다.

 

 

➡️Bubble_Sort의 과정 

  1. 앞에서부터 현재 원소와 다음의 원소를 비교한다.
  2. 현재 원소가 다음 원소보다 크면 원소를 교환한다.
  3. 다음 원소로 이동하여 앞 과정을 반복한다.

위 과정은 아래 그림과 같다.

출처:https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html

각 회전은 배열의 크기 -1만큼 진행된다.

각 회전별 비교횟수는 배열크기에서 회전횟수를 뺀 만큼 비교한다.

 

 

https://en.wikipedia.org/wiki/Bubble_sort

 

 

💻구현하기💻

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class BubbleSort {
 
    public static void bubble_sort(int[]arr){
        bubble_sort(arr, arr.length);
    }
 
    
    private static void bubble_sort(int[]arr,int size){
 
           //회전은 배열 크기 - 1 만큼 진행됨
        for(int i =1; i<size; i++){
 
            // 각 회전별 비교횟수는 배열 크기의 현재 회전을 뺀 만큼 비교함
            for (int j = 0; j<size -i; j++){
                
                /*
                 *  현재 원소가 다음 원소보다 클 경우
                 *  서로 원소의 위치를 교환한다.
                 */
 
                if(a[j]> arr[j+1]){
                    swap(arr, j ,j+1);
                }
 
            }
        }
    }
 
    private static void swap(int []arr ,int i, int j){
        int temp =arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
 
cs

 


REFERENCE

728x90

'Dev > 알고리즘 ,자료구조' 카테고리의 다른 글

[Algorithm]BeakJoon_1330  (0) 2021.07.18
Insertion_Sort(삽입 정렬)  (0) 2021.06.30
Selection_Sort(선택 정렬)  (0) 2021.06.29
스택(Stack) JAVA로 구현  (0) 2021.04.24
자료구조_배열(Array)  (0) 2021.03.11
728x90

 

 

의존관계 주입은 크게 4가지 방법이 있다.

  • 수정자 주입 (setter 주입)
  • 필드 주입
  • 일반 메서드 주입 
  • 생성자 주입 

 

👉수정자 주입(setter 주입)

  • setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.
  • 선택,변경 가능성이 있는 의존관계에 사용한다.
  • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
public class OrderServiceImpl implements OrderService{
 
    private MemberRepository memberRepository;
    private DisCountPolicy discountPolicy;
 
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository){
        
        this.memberReposityory = memberRepository;
    
    }
 
    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy){
        
        this.discountPolicy = discountPolicy;
        
    }
 
 
}
cs

 

👉필드 주입

  • 말 그대로 필드에 바로 주입하는 방법이다.
  • 코드가 간결해서 좋을거라고 생각할 수 있지만 외부에서 변경이 불가능 해서 테스트를 하기 힘들다는 치명적인 단점을 가지고 있다.
  • DI프레임워크가 없으면 아무것도 할 수 없다.
  • 필드 주입이 유용하게 쓰일수 있는 곳은 실제 코드와 관련이 없는 테스트 코드에서는 사용할 수 있다.
  • 스프링 설정을 목적으로 하는 @Configuration같은 곳에서만 특별한 용도로 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class OrderServiceImpl implements OrderService{
 
    @Autowired
    private MemberRepository memberRepository;
 
    @Autowired
    private DisCountPolicy discountPolicy;
 
    
 
 
}
cs

 

 

👉일반 메서드 주입

  • 일반 메서드를 통해서 주입 받을 수 있다.
  • 한번에 여러 필드를 주입 받을 수 있지만 잘 사용하지는 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class OrderServiceImpl implements OrderService{
 
 
    private MemberRepository memberRepository;
    private DisCountPolicy discountPolicy;
 
    @Autowired
    public void init(MemberRepository memberRepository,DisCountPolicy discountPolicy){
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;         
 
}
cs

 

👉생성자 주입

  • 이름 그대로 생성자를 통해서 주입 받는 방법이다.
  • 생성자 호출 시점에 딱 한번만 호출되는 것이 보장된다.
  • 불변,필수 의존관계에 사용 
1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class OrderServiceImpl implements OrderService{
 
 
    private final MemberRepository memberRepository;
    private final DisCountPolicy discountPolicy;
 
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository,DisCountPolicy discountPolicy){
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;         
 
}
cs

+@ 생성자가 하나만 있으면 @Autowired를 생략해고 자동 주입된다.

 

👉생성자 주입 권장

일단 대부분이 이 4가지 방법 중에 생성자 주입을 권장한다. 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다.

 

👉생성자 주입 권장하는 이유

불변

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지의 의존관계를 변경할 일이 없다.
  • 그리고 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다.
  • 수정자 주입을 사용하면, setXXX메서드를 public으로 열어 두어야 한다.혹여나 누가 변경할 수 도 있기때문에 좋은 설계는 아니다.
  • 생성자 주입은 객체를 생성할 때 딱 한번만 호출되서 이후에는 호출될 일이 없다.

또 다른 장점은 생성자 주입을 사용하면 주입데이터를 누락 했을 때 컴파일 오류가 발생한다.그래서 바로 알 수 있다는 장점이 있다.

생성자 주입시에 final키워드를 사용한다.생성자에 혹시라도 설정되지 않는 오류를 컴파일 시점에서 막아준다.

 

 

 

정리

  • 생성자 주입 방식은 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘살리는 방법이기도 하다.
  • 기본적으로 생성자 주입을 사용하고, 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하면 된다.
  • 생성자 주입과 수정자 주입을 동시에 사용할 수 있다.
  • 필드 주입은 되도록이면 사용하지 않는게 좋다.
728x90

'Dev > Spring' 카테고리의 다른 글

@RequestMapping에 대하여  (0) 2021.07.24
[Spring]@RestController 와 @Controller의 차이  (0) 2021.07.18
로깅(Logging)  (0) 2021.07.13
[Spring]의존성 주입(Dependency Injection)  (0) 2021.06.24
[Spring]@RequiredArgsConstructor  (0) 2021.06.23
728x90

➡️의존성 주입이란

  • 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법이다.
  • 예를 들어 장난감,리모컨,휴대폰 모두 배터리를 교체 할 수 있는 제품이라면 장난감,리모컨,휴대폰 모두 배터리에 의존하기 때문에 배터리를 갈아끼우는 것을 의존성 주입이라고 보면 된다.
  • 그러나 만약 장난감이나 휴대폰이 배터리 교체가 불가능한 일체형이라면 교체하지 못하고 새제품으로 바꿔야 하기때문에 설계로 본다면 유연하지 못한 설계가 된다.

밑에 예제를 보고 의존성 주입이 필요한 이유를 알아보자

1
2
3
public class Americano{
 
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Cafe{
 
    private Americano americano; 
    
    public Cafe() { 
 
        this.americano = new Americano();
    }
 
 
 
}
cs
  • 예를 들어 아메리카노를 파는 카페 클래스를 만들었다.
  • 그러나 위 예제는 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어지고 있다. 객체지향적 설계라면 객체들 간에 관계가 맺어져야 하지만 현재는 카페 클래스와 아메리카노 클래스끼리 관계를 맺고 있다.객체들 간에 관계가 맺어졌다면 다른 커피종류의 클래스가 생겼는데 카페클래스가 알지 못하더라도 인터페이스 타입으로 사용할 수 있다.
  • 그리고 카페클래스에서 메뉴를 추가할려면 카페클래스의 생성자 변경이 필요하다.일단 유연성이 떨어진다는 단점이 있다.
  • 이걸 보면 상속으로는 해결할 수 있을거 같은데?라고 생각 하실수도 있지만 상속은 제약이 많고 확장성이 떨어지므로 피하는것이 좋다.
  • 이 같은 문제는 관심사 분리가 되지 않았기 때문에 발생하는 문제이다. Spring에서는 의존성 주입을 통하여 이런 문제를 해결하려고 한다.

 

위와 같은 문제를 해결하기 위해선 다형성이 필요하다.일단 여러 메뉴를 하나로 표현하기 위해서는 인터페이스가 필요하다.그리고 Americano클래스에서 인터페이스를 우선 구현을 해준다.

1
2
3
4
public interface Menu{
 
 
}
cs

 

1
2
3
4
public class Americano implements Menu{
 
 
}
cs

 

다음으로 위에 문제가 있는 코드에서 Cafe와 Americano가 결합된 부분을 제거해준 다음 외부에서 상품을 주입(Injection)받아야 한다

1
2
3
4
5
6
7
8
9
10
11
public class Cafe { 
    
    private Menu menu; 
    
    public Cafe(Menu menu) { 
           
  this.Menu = menu;
 
    } 
}
 cs
 
   

➡️이제 여기서부터 Spring이 DI컨테이너가 필요하다. 왜냐하면 Cafe에서 Menu객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체를 생성해야 하고,의존성이 있는 두 객체를 연결하기 위해 한객체는 다른 객체주입시켜야 하기 떄문이다.

1
2
3
4
5
6
7
8
9
10
11
12
public class BeanFactory { 
    public void cafe() {
 
            Menu americano = new Americano(); 
            
 
            Cafe cafe = new Cafe(americano); 
    }
 
}
 
 



cs

➡️위 처럼 Americano객체를 만들고 ,객체를 Cafe로 주입시켜주는 역할을 위해서 DI 컨테이너가 필요한것이다.

 

➡️또 이러한 개념은 제어의 역전이라고 불리기도 한다.객체를 사용할지에 대한 책임이 Beanfactory로 넘어갔고 객체 자신은 수동적으로 중비받는 객체를 사용하기때문이다.

 

💻의존성 주입 장단점

장점

  •  재사용성을 높여준다.
  •  테스트에 용이하다.
  • 코드를 단순화 시켜준다.
  • 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워지는 점이 있다.
  • 종속성이 감소하기 때문에 변경에 민감하지 않다.
  • 결합도(coupling)는 낮추면서 유연성과 확장성은 향상 시킬 수 있다.
  • 객체간의 의존관계를 설정할 수 있다.

단점

  • 의존성 주입을 위한 선행작업이 필요함.
  • 코드를 추적하고 읽기가 어려워짐.

 

마무리

➡️한 객체가 어떤 객체를 의존할 것인지는 별도의 관심사다.DI 컨테이너를 통해 서로 강하게 결합되어 있는 두 클래스를 분리하고, 두 객체 간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보하고자 하였다. 의존성 주입으로 애플리케이션 실행 시점에 객체를 생성하고 관계를 결정해 줌으로써 다른 구체 클래스에 의존하는 코드를 제거하며 서로 다른 두 객체의 결합을 약하게 만들어 주었다. 또한 이러한 방법은 상속보다 훨씬 유연하다
의존 관계를 주입할 객체를 계속해서 생성하고 소멸한다면, 아무리 GC가 성능이 좋아졌다고 하더라도 부담이 된다. 그래서 Spring에서는 Bean들을 기본적으로 싱글톤(Singleton)으로 관리하는게 좋을거 같다.

 

 


REFERENCE 

 

728x90

'Dev > Spring' 카테고리의 다른 글

@RequestMapping에 대하여  (0) 2021.07.24
[Spring]@RestController 와 @Controller의 차이  (0) 2021.07.18
로깅(Logging)  (0) 2021.07.13
[Spring]다양한 의존관계 주입 방법  (0) 2021.06.25
[Spring]@RequiredArgsConstructor  (0) 2021.06.23
728x90

@RequiredArgsConstructor

    • 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다.
    • 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용됩니다.
1
2
3
4
5
6
7
8
@Service
@RequiredArgsConstructor
public class RequiredArgsConstructorService{
 
    private final OneRepository oneRepository;
    private final TwoRepository twoRepository;
    private final ThreeRepository threeRepository;
}
cs

위 처럼 Service클래스를 생성하였습니다. 이제 @RequiredArgsConstructor가 어떤 역할을 하는지 확인해 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class RequiredArgsConstructorService{
 
    private final OneRepository oneRepository;
    private final TwoRepository twoRepository;
    private final ThreeRepository threeRepository;
 
    public RequiredArgsConstructorService(OneRepository oneRepository,TwoRepository twoRepository,ThreeRepository threeRepository){
 
        this.oneRepository = oneRepository;
        this.twoRepository = twoRepository;
        this.threeRepository = threeRepository;
 
}
}
cs

@RequiredArgsConstructor가 final필드를 매개변수로 하는 생성자를 생성해줍니다.매개변수로 있는 Repository는 빈으로 등록이 가능합니다.위 코드처럼 빈에 생성자가 오직 하나만 있고 생성자의 파라미터타입이 빈으로 등록 가능한 존재라면 @Autowired없이도 의존성 주입이 가능합니다.

 

 

 

@RequiredArgsConstructor을 이용해서 의존성 주입하는 방법을 알아봤습니다.

다음엔 의존성 주입의 다양한 종류를 알아보고 장단점이 뭔지 써보겠습니다.


 

 

728x90

'Dev > Spring' 카테고리의 다른 글

@RequestMapping에 대하여  (0) 2021.07.24
[Spring]@RestController 와 @Controller의 차이  (0) 2021.07.18
로깅(Logging)  (0) 2021.07.13
[Spring]다양한 의존관계 주입 방법  (0) 2021.06.25
[Spring]의존성 주입(Dependency Injection)  (0) 2021.06.24
728x90

💻JPA란?

  • 자바 퍼시스턴스 API또는 자바 지속성 API(Java Persistence API, JPA)는 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
  • 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음이다.
  • 실제로 동작하는 것은 아니다
  • JPA인터페이스를 구현한 대표적인 오픈소스가 Hibernate이다.

  • 과거의 자바 표준은 EJB였다.그러나 EJB를 사용하면 코드가 매우 지저분하고 속도가 느리다는 단점을 가지고 있었다.

 

👉ORM

  • ( Object-relational mapping (객체 관계 매핑))은객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
  • ORM 프레임워크가 중간에서 매핑해주고 대중적인 언어에는 대부분 ORM 기술이 존재한다.
  • ORM은 객체와 RDB 두 기둥 위에 있는 기술 이다.


 

💻JPA 특징

  • 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성합니다. 보통 JDBC를 사용하여 개발을 하다보면 코드가 비슷한 형태로 반복되게 됩니다.
    DB커넥션을 구하고, 쿼리를 작성하고, 파라미터를 설정하고 실행한 결과를 자바 객체에 설정합니다. 
     여기서 문제점은 테이블의 컬럼명이 추가, 삭제, 변경이 된다면 관련되어 있는 모든 쿼리를 수정해야 할 것인데 JPA는 매핑 설정만 변경하면 됩니다. 
    또한 실행한 쿼리를 자바 객체에 설정해줘야하는데 JPA는 자바 객체로 매핑하여 검색할 수 있습니다. 즉 유지보수가 쉽습니다.

  • 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원합니다.

  • JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있습니다. 하지만 잘못이해하고 사용하는 JPA는 성능을 크게 감소시킬 수 있습니다.

📖JPA를 왜 사용해야 하는가?

1. SQL 중심적인 개발에서 객체 중심으로 개발

2. 생산성

  • JPA를 사용하는 것은 마치 Java Collection에 데이터를 넣었다 빼는 것처럼 사용할 수 있게 만든 것이다.
  • 간단한 CRUD
  • 저장: em.persist(member)
  • 조회: Member member = em.find(memberId)
  • 수정: member.setName("변경할 이름")
  • 삭제: em.remove(member)
  • 특히, 수정이 굉장히 간단하다.객체를 변경하면 그냥 알아서 DB에 UPDATE Query가 나간다
           

3. 유지보수

  • 기존: 필드 변경 시 모든 SQL을 수정해야 한다.
  • JPA: 필드만 추가하면 된다. SQL은 JPA가 처리하기 때문에 손댈 것이 없다.


🙉REFERENCE

 

 

 

 

 

728x90

[Network]HTTP와 HTTPS

ryudjae
|2021. 6. 21. 15:30
728x90

📡HTTP란?

  • HTTP는 HyperTextTransferProtocol의 약자로 하이퍼텍스트 문서를 교환하기 위하여 사용된 통신 규약이다.
  • 웹 서버와 클라이언트 간의 통신을 하기 위한 통신 규약이다.
  • HTTP는 1989년 팀 버너스 리에 의해 처음 설계되어 인터넷을 통한 월드 와이드 웹 기반에서 전 세계적인 정보 공유를 이루는데 큰 역할을 했다.
  • HTTP는 웹에서만 사용하는 프로토콜로 TCP/IP기반으로 한 지점에서 다른지점(서버와 클라이언트)으로 요청과 응답을 전송한다.

 

📡HTTP의  특징

  • HTTP 메시지는 HTTP 서버와 HTTP 클라이언트에 의해서 해석이 된다.
  • TCP/IP를 이용하는 응용 프로토콜(application protocol)입니다.HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜이다. (이러한 단점을 해결하기 위해 Cookie와 Seesion 등장)
  • HTTP는 연결을 유지하지 않는 프로토콜이기 떄문에 요청/응답(request/response) 방식으로 동작한다.


기본적으로 위 그림과 같이 동작한다.

클라이언트(client) 즉, 사용자가 브라우저를 통해서 어떠한 서비스를 url을 통하거나 다른 것을 통해서 요청(request)을 하면 서버에서는 해당 요청사항에 맞는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다.

 

- 요청 : client -> server

- 응답 : server -> client


📡HTTPS란?

HyperText Transfer Protocol over (SSL)Secure Socket Layer, HTTP over TLS, HTTP over SSL, HTTP Secure 등으로 불리는 HTTPS는 HTTP에 데이터 암호화가 추가된 프로토콜이다. HTTPS는 HTTP와 다르게 433번 포트를 사용하며, 네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 공개키 암호화를 지원하고 있다.

HTTPS는 TCP위에 놓인 보안계층(SSL)위의 HTTP이다

 

공개키/개인키

HTTPS는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화 한다.공개키와 새인키는 서로를 위한 1쌍의 키이다.

  • 공개키 : 모두에게 공개가능한 키
  • 개인키 : 나만 가지고 알고 있어야하는 키

공개키와 개인키로 암호화하면 얻을수 있는 효과

  • 공개키 암호화 : 공개키로 암호화를 하면 개인키로만 복호화를 할 수 있다. => 개인키는 나만 가지고 있으므로, 나만 볼 수 있다.
  • 개인키 암호화 : 개인키로 암호화하면 공개키로 복호화를 할 수 있다.  =>공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.

SSL(Secure Socket Layer)?

SSL 디지털 인증서 =>클라이언트와 서버간의 통신을 공인된 제3자업체가 보증해주는 전자화된 문서이다.

SSL 디지털 인증서의 장점

  • 통신 내용이 노출, 변경되는 것을 방지한다.
  • 클라이언트가 접속하려는 서버가 신뢰 할 수 있는 서버인지 확인이 가능하다.
  • SSL 통신에 사용할 공개키를 클라이언트에게 제공한다. 

SSL에서 사용하는 암호화의 종류 

  • 암호 : 텍스트를 아무나 읽지 못하도록 인코딩하는 알고리즘
  • 키 : 암호의 동작을 변경하는 매개변수, 키에 따라서 암호화 결과가 달라지기 떄문에 키를 모르면 복호화가 불가능하다.

 

CA : https://ko.wikipedia.org/wiki/인증_기관

인증서 내용

  • 인증서의 내용은 CA의 비공개 키를 이용해서 암호화 되어 웹브라우저에게 제공된다.
  • 서비스 정보 (인증서 발급자, CA의 디지털 서명,서비스 도메인)
  • 서버측 공개키

SSL 인증서의 서비스 보증방법

  • 웹브라우저가 서버에 접속하면 서버는 제일 먼저 인증서를 제공한다.
  • 브라우저는 인증서를 발급한 CA가 자신이 갖고있는 CA 리스트에 있는지 확인한다.
  • 리스트에 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다.
  • 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다. 즉 데이터를 제공한 사람의 신원을 보장해주게 되는 것이다.

SSL 동작방법

  • 공개키 암호 방식은 알고리즘 계산방식이 느린 경향이 있다.
  • 따라서 SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키 암호화 방식을 혼합하여 사용한다.
  • 안전한 의사소통 채널을 수립할 때는 공개키 암호를 사용하고, 이렇게 만들어진 안전한 채널을 통해서 임시의 무작위 대칭키를 생성 및 교환한다. 해당 대칭키는 나머지 데이터 암호화에 활용한다.

SSL 통신과정

  • 컴퓨터와 컴퓨터가 네트워크를 통해서 통신을 할때 핸드쉐이크 -> 세션 -> 세션종료 의 과정을 거친다.
  • 암호화된 HTTP 메시지를 교환하기 전에 클라이언트와 서버는 SSL 핸드쉐이크를 진행한다.

 

📡 HTTP와 HTTPS

HTTP는 암호화가 추가되지 않았기 때문에 보안에 취약한 반면, HTTPS는 안전하게 데이터를 주고받을 수 있다. 하지만 HTTPS를 이용하면 암호화/복호화의 과정이 필요하기 때문에 HTTP보다 속도가 느리다.또한 HTTPS는 인증서를 발급하고 유지하기 위한 추가 비용이 발생하다.

개인 정보와 같은 민감한 데이터를 주고 받아야 한다면 HTTPS를 이용해야 하지만, 단순한 정보 조회 등만을 처리하고 있다면 HTTP를 이용하면 된다.

 


REPERENCE

728x90

'Dev > Network' 카테고리의 다른 글

[Web] REST API 와 HTTP API  (0) 2022.01.04
HTTP 메서드(GET,POST,PUT,PATCH,DELETE)  (1) 2021.07.12
[Network]HTTP 상태코드  (0) 2021.05.23
728x90

💻MSA란

애플리케이션 개발 초기에는 전체 애플리케이션의 소스 코드를 하나의 배포 유닛(war 또는 ear)으로 내장시키는 '모놀리식' 방식을 이용하였다. 하지만 기존 애플리케이션에 최소한의 변경 사항이 있어도 자체적인 QA(Quality Assurance) 주기에 따라 대규모 업데이트를 해야 하거나 일부 애플리케이션의 업데이트로 오류가 발생한 경우 전체를 오프라인으로 전환하고 문제를 해결하는 등 다운타임이 발생하게 되었다. 

이러한 문제점을 해결하기 위해 전통적인 모놀리식(monolithic) 접근 방식과 다르게 애플리케이션을 핵심 기능으로 세분화하여 하는 MicroService(MS)라는 아키텍처 기반의 접근 방식이 탄생하게 되었다. 여기서 각 기능을 서비스라고 부르며, 독립적으로 구축하고 배포할 수 있게 되었다.

예를 들어 온라인 쇼핑몰 사이트에서 제품을 검색하기 위한 검색 기능도 하나의 서비스가 되며, 구매를 추천해주는 추천 내역 역시 하나의 서비스가 될 수 있다. 마찬가지로 장바구니 역시 하나의 서비스가 될 수 있다. 이렇게 MS는 애플리케이션의 핵심 기능으로, 다른 서비스들과 독립적으로 작동한다. 또한 다른 서비스들과 유연하게 결합하며 향후 확정 및 새로운 기능 통합 등에 대비할 수 있다.

👉Monolithic Architecture 

모놀리식 아키텍쳐란, 마이크로서비스 아키텍쳐의 반대 되는 개념으로 전통의 아키텍쳐를 지칭하는 의미로 생겨난 단어이다.하나의서비스 또는 어플리케이션이 하나의 거대한 아키텍쳐를 가질때 , 모놀리식이라고 한다.

 

💻MSA특징

 

👉데이터 분리

데이터 저장 시 하나의 DB에 중앙 집중화를 하지 않고 서비스 별 별도의 데이터 베이스를 사용합니다. DB의 종류를 별도로 가져갈 수도 있고, 같은 DB를 사용하더라도 나누어서 사용하게 됩니다. 데이터가 분산되어있기 때문에 다른 서비스 컴포넌트에 대한 의존성이 없이 서비스를 독립적으로 개발 및 배포/운영 할 수 있지만, 다른 컴포넌트의 데이터를 API통신을 통해 가져와야 하기 때문에 성능상의 문제가 발생 할 수 있고, 트렌젝션으로 묶을 수 없는 문제가 발생하기도 합니다.

 

API Gateway

MSA의 문제점 중 하나는 각 서비스가 다른 서버에 분리 배포되어있기 때문에 서버 URL이 각기 다를 수 밖에 없습니다. 이때 API Gateway는 API 서버 앞 단에서 모든 API 서버들의 End-Point를 단일화하여 묶어주는 역할을 합니다. 또한 거미줄처럼 복잡한 서비스간의 API호출 구조도 단순화 시켜줍니다. 그 외에 라우팅, 로드밸런싱, 인증 역할 등등 여러 역할을 수행합니다.

💻MSA 장점 

  • 분산형 개발을 통해 효율적인 개발 가능하다
  • 개별 서비스가 다른 서비스에 부정적인 영향을 주지 않으면서 작동할 수 있다.(뛰어난 복구 능력)
  • 다른 서비스들과 유연하게 결합하며(언어의 제약 X) 향후 확장 및 새로운 기능 통합 등에 대비할 수 있다.(높은 확장성)
  • 기존의 모놀리식에 비해 더욱 모듈화되었기 때문에 배포에 따른 우려 사항들이 적어진다.(손쉬운 배포)
  • 개발자들이 각각의 서비스를 파악하고 개선하기에 용이해짐(편리한 액세스)

 

💻MSA 단점 

  • 큰 프로젝트에는 많은 서비스들이 존재하므로, 모든 서비스를 모니터링 하는 오버헤드가 증가한다.
  • 서비스에서 다른 서비스를 호출하므로 서비스에 장애가 발생한 경우 경로 및 장애 추적이 힘들 수 있다.
  • 서비스별로 로그가 생성되기 때문에 중앙 로그 모니터링은 존재하지 않는다.
  • 각 서비스는 API를 통해 통신하므로 네트워크 통신에 의한 오버헤드가 발생한다.



🙈REFERENCE🙉

 

728x90