Spring-Day01

JUNHO YEOM·2023년 2월 20일
0

Spring

목록 보기
9/14

2023.02.20

개발환경 Setting

  1. Eclipse에 Spring plugin을 설치
    필요없는 것 빼고 compact하게 구동 가능
  2. STS(Spring Tool Suite)
    사용하기 편함, 모든 것이 다 들어있어서 무거워요
    우리는 이걸로 해요!

Spring과 Spring boot

Spring
원래 이게 먼저 나왔고, 기반 기술이에요

Spring boot
빠르고 편하게 프로그램을 개발하기 위해서 만들어졌어요!


Spring STS다운로드하기

https://dist.springsource.com/release/STS/index.html

약 400M의 파일이에요
저는 Mac을 쓰니까 Mac OS X 링크를 눌러서 다운로드 해 주었어요

다운로드가 완료 되었다면 압축을

  1. 분리 ㅣSOC(seperation of concern) 관심사의 분리
    같은 concern(주제)가 한곳에 분리되어 존재해야지 여기저기 나타나면 곤란해요

  2. Step2로 코드를 refactoring

  3. UserDao를 확장
    UserDao를 확정
    혼자 무리가 없어요.
    문제가 변했어요 UserDao를 판매해야 해요 => N사에 판매해야 해요
    How?? Java Class기능으로 확장 -> Inheritance(상속)
    변할 수 있는 여지가 있는 코드(concern)을 "추상화" 시켜야 해요

추상화 시킨다는것은 구체적인 내용을 만들지 않는 것이에요


상속관계에 있어서
UserDao(기본적인 로직 흐름) <= NUserDao(기능의 일부<조직의 일부>분을 가지고 있어요

이렇게 구조를 잡아서 프로그래밍 하는 Design Pattern을
Template method pattern 이라고 해요

example

aa(){
call_A(); 상위 클래스가 가지고 있어요
call_B(); 상위 클래스가 가지고 있어요
call_C(); 하위 클래스가 가지고 있어요
}

상위 클래스가 가지고 있는 로직의 흐름에 대해서 그중의 일부를 하위 클래스(상속관계인)에서 해당 method를 오버라이딩 하고 기능을 완성시키는 방법


상속 관계에 있어서 상위 class => UserDao
getConnection() => 객체 생성 추상화 시켜서 직접 생성하지 않게 해요

상위 class => UserDao
||
V
하위 클래스 => NUserDao

관점을 바꿔서 생각해봐요
상위 클래스에서 필요한 Method를 하위 클래스에서 만들고
거기서 가져오고 있어요
Factory Method Pattern : 구체적인 객체 생성 방법을 하위 클래스에서 결정하는 Design Pattern


분리 & 확장(Inheritance)

Inheritance(상속)
1. Java는 Single Inheritance(단일 상속)만을 지원합니다.
2. 상속은 Class가 tightly coupled 되요! (강한 결합 상태)

Step 4 기준으로

연결 정보를 가져오는 Class에 대해 너무 상세히 알고 있기 때문에(Class의 이름을 명시하고 있어요!) Tightly Coupled 되어 있어요..!
Tightly Coupled된 코드(강결합)를 어떻게 Loosely Coupled(약결합) 상태로 바꿔야 확장성을 가질 수 있을 것 같은데, 어떻게 해결할 수 있을까요?
Interface를 가지고 해결할 수 있을 것 같아요!


Step 5 Interface를 적용

Interface로 확장성을 확보 하였습니다.
코드가 많이 좋아졌지만, 아직 쓸 수 있는 형태는 아니에요
Class안에서 다른 Class 이름이 나오지 않도록 처리하고 싶어요

Step 6. 주입하는 방식으로 이용

강결합 상태를 줄이기 위해서 ConnectionMaker를 주입해 주었어요.
확장성 있는, 재사용 가능한 녀석으로 만들기 위한 코드의 변경이었어요.

template method 패턴과 살짝 구분이 되는것

Strategy Pattern(전략 패턴)
자신의 기능 Context의 일부분을 interface를 통해 통째로 외부로 분리시키는 design pattern

맨 마지막은 전략 패턴이에요
Spring의 가장 큰 pattern이에요!

Step 6의 예제는 Strategy Pattern을 이용했어요
전략 패턴을 사용하기 위해서는
전략을 주입시키는 또다른 객체가 필요해요(UserDaoTest처럼)


Step 7.

IoC(Inversion Of Controll) 제어의 역전

Spring은 IoC Container에요
(Bean)들을 관리하는 Container는 제어의 역전(Ioc)방식으로 동작합니다.
(사실 Servlet Container도 Ioc방식으로 동작해요)

Step 6까지 진행한 코드를 보면, 잘 만들었어요 단계에 따라서 좋아졌어요
UserDaoTest는 원래 UserDao의 동작이 제대로 작동하는지 확인하는 기능을 가지고 있었어요
그런데 우리가 추가적인 기능을 더 부여해 주었어요
객체간의 Runtime 연관성을 맺어주는 코드
이 부분은 분리시켜줘야 할 것 같아요

객체를 만들어 분리하는 역할을 만들어서 나누어 줄게요
객체를 찍어내는 Class(Factory)를 만들어 줘요

하지만 클래스를 만들때는 분리, 확장을 기억해 줘야 해요
분리 SOC (Seperate of Concern)
확장

제어의 역전이란
IoC 제어의 흐름을 거꾸로 뒤집는 현상을 지칭합니다.
객체는 자신이 사용할 객체를 직접 스스로 선택하지 않아요.
당연히 생성하지도 않아요
컨테이너라고 부르는 친구에게 위임해서 찾고 리턴해 주도록 합니다.

내가 직접 클래스름 만들고, 메서드를 사용하는것에 대해서 변해서
다른 객체나, Container들이 제어권을 갖고처리해 주는 것을 말 합니다.

스프링은 IoC로 동작해요

Spring Container가 알아서 Class선택해서 객체 만들어서 줘요(우리는 제공 받는 역할이에요)


Annotation

Servlet에서
@WebServlet => annotation이라고 해요
public class MemberServlet {
...
}

@으로 시작해서
1번째 사용 방식. 정해져 있는 키워드로 동작합니다.(Java에서 정해놨어요)
2번째 사용 방식. 개발자가 만들어서 사용할 수 도 있어요

이런 annotation은 주석이라고 해석되는데(번역만) 실제로 주석은 아니에요
비지니스 로직에는 영향을 주지 않아요 그 대신 program의 구조에 영향을 줘요


여기까지가 기본적인 설명이었어요...!

이제부터 Spring의 IoC에 대해서 알아보아요!

Spring은 상당히 방대한 기능을 가지고 있어요!

가장 핵심이 되는 기능은

BeanFactory기능이에요 => Application Context라고 불러요(빈들의 생성, 관계를 포괄하는 개념)

Application Context

DaoFactory와 같은 IoC기능을 일반화 시킨 Container

Spring이 제어권을 가지고 직접 만들고 관계를 부여하는 객체를 Bean이라고 이야기 합니다.

Application Context는 별도의 설정 정보가 필요해요
그래야 Container(Application Context)가 Bean들을 관리 할 수 있는거에요!
방법 1. XML로 설정하기(XML에 모든 내용을 다 정리해야되요. 프로젝트가 커질수록 양이 많아지고, 복잡해져요 그대신 프로젝트의 설정 정보를 한눈에 볼 수 있다는 장점이 있어요)

방법 2. Annotation으로 설정정보를 Code안에 기입하기(코드가 많아지지 않아요. annotation 코드가 이곳저곳 나누어져 있어서 나중에 한눈에 관계를 파악하기 힘들어요)


Bean에 대해서 알아볼까요?

Bean: Application Context라 불리는 BeanFactory에서 관리하는 객체

Bean의 구성 요소
1. Class에요 -> Bean으로 등록한 Java Class속성을 의미합니다.(full package 패키지 주소 전체를 모두 명시해야 해요)
2. Id를 가지고 있어요(Bean의 고유 식별자), Bean의 이름
3. Scope를 가지고 있어요 -> Singleton, prototype, request, session중에 하나를 가져요 웹이 아닌 환경에서는 Singleton과 prototype을 사용해요
4. Constructor Arg -> Bean 생성시 생성자에게 전달할 인자를 의미해요
5. Property: Bean 생성시 Setter에게 전달할 인자를 표현할 때 사용하는 구성요소에요

이와 같은 내용을 기반으로 Bean을 등록하고 Bean을 Singleton으로 생성해서 관리해요!

request, session은 웹에서만 사용할 수 있는 scope에요


Bean을 등록하기 위한 방법

  1. 수동
  2. 자동
  3. 등등

Bean을 수동으로 등록하는 방법

annotation으로 알아보아요

public class MyResource {
	
}
이 클래스의 객체를 Bean으로 관리하고 싶어요!

ApplicationContext는 설정 정보를 바탕으로 Bean을 관리해요
설정 클래스는 따로 있고, 그 설정 클래스의 Annotation을 붙여서 ApplicationContext가 관리하도록 해요!

설정 Class가 있어야 해요!
설정정보는 Xml, Annotation으로 설정할 수 있어요

Bean을 수동으로 관리하는 방법

관리하고 싶은 class
public class MyResource {
	
}


설정 클래스
@Configuration // 설정 Class라는 것을 알려주기 위해서 annotation을 사용해요
public class MyResourceConfig {
	@Bean // Bean이라는 것을 알려주기 위해 annotation을 사용해요
    public MyResource getResource(){
    	return new MyResource; // 1. 클래스의 인스턴스를 뽑아내는 method를 선언해요
    }
}
annotation을 보고 Spring은 설정 정보로 인식해요
실제로 Bean이 만들어 내는 Class속성을 return new MyResource를 통해서 알 수 있는 거에요.
BeanId는 method이름이 되어요(getResources)
BeanIdUnique해야 해요따라서 Method의 이름이 중복되면 안됩니다. 

Spring Container(Application Context)는 @Configuration이 붙은 Class를 Bean으로 등록해요
@Configuration도 Bean으로 등록하고, 이 클래스를 Bean으로 등록하고, 해당 Class를 해석해서 @Bean을 찾아 해당 Method에 의해서 생성되는 객체를 Bean으로 생성합니다.


  1. 코드 작성
  2. 메서드
  3. 상속
  4. 인터페이스
  5. 전략 패턴

0개의 댓글