Spring Framework 설치, 스프링과 Maven, Maven Spring Project 생성, IoC, DI (Dependency Injection)
*22년 4월 한 달간 한국이러닝협회의 '실전 개발자를 위한 Spring Framework'를 수강하고 정리한 내용입니다
1. Spring Framework 설치
(1) Java SDK 설치 확인
- 명령 프롬프트를 실행한 후, 커서에 “java -version” 입력
(2) Eclipse용 STS 설치
- STS (Spring Tool Suite): Spring에서 공식적으로 지원하는 IDE
- Spring의 공식 홈페이지 “https://spring.io” 접속 → 메뉴바에서 Project 클릭
→ 자신의 컴퓨터 운영체제에 맞는 Spring Tools 4 for Eclipse 설치
→ C드라이브 (로컬 디스크 C) 폴더 하위에 포함시키고 압축 풀기
(3) Tomcat (WAS) 설치
- STS에는 기본 Tomcat (기본 local 서버)이 있지만, 가장 많이 쓰이는 Tomcat을 별도로 설치하여 STS에서 기본 서버 대신 사용
2. 스프링과 Maven
(1) Spring의 시작/Maven
- 역할: 외부 라이브러리 관리
- Maven이 gradle과 상호 보완 관계는 아님
- Maven이 ANT를 완전히 대체하게 됨
- Convention over Configuration(CoC): 개발자들이 자주 쓰는 로직(Best Practice)에 대한 설정 (Convention)을 미리 정의해둠.
별도로 설정하지 않아도 설정된 사항(관례)을 그대로 따라서 개발할 수 있음
***최근에는 개발자들이 개발환경 설정하는 걸 힘들어하고 개발 사이클이 짧아지는 경향이 있어서,
Convention over Configuration이 더 유력함
***Node.js의 경우, 위와는 반대로 Configuration over Convention이므로 관례보다는 설정을 중요시 여김. 개발자의 창의와 자유 보장.
- Java 기반 Web 애플리케이션의 Best Practice를 따름: 개발 디렉토리 구조와 빌드 단계도 Convention하게 정의해둬서, 구조가 거의 유사함
(3) 의존성 관리를 자동으로 수행/POM.XML .. 메이븐의 메인 설정파일
- 라이브러리를 200개 이상 사용해야 할 때가 많은데, 이때 업데이트를 해서 버전이 바뀔 경우 의존성들이 충돌할 수 있음.
- 메이븐은 의존성을 하나의 중앙 저장소(Maven 중앙 저장소)에 모아두고 관리함.
- POM.XML에 프로젝트의 모든 정보가 담겨있음. 이 파일이 있으면 무조건 메이븐을 사용한 프로젝트
(4) 프로젝트 명/그룹 아이디/버전 설정
- 그룹 아이디: 위처럼 이름을 정해야, 다른 기관에서 만든 프로젝트와 충돌할 일이 없음
(5) Maven 3 버전 사용
1) Spring Starter Project - 스프링부트
2) Spring Legacy Project - 기존 스프링 프로젝트 생성 (일부 코드를 같이 생성해 줌)
3) Dynamic Web Project
- 처음부터 프로젝트를 본인이 직접 설정해야 함.
스프링 프로젝트를 만들기 위한 프로젝트 템플릿은 아님. J2EE 웹 어플리케이션 만드는 템플릿임.
4) Maven Project - 처음부터 프로젝트를 본인이 직접 설정해야 함. 메이븐 프로젝트(pom.xml 파일).
3. Maven Spring Project 생성
(1) Maven 기반 Spring Project 설정 방법- 1. STS의 프로젝트 자동 생성 기능을 사용
- 웹 애플리케이션 형태로 된다면, 다이나믹 웹 프로젝트로 진행하는 것이 좋음
- 다이나믹 웹 모듈 버전(중요한 요소)을 3.1, Apache Tomcat을 설치하고 버전을 8.0으로 설정하면 Spring 4.n대 버전을 지원함
***직접 찾아본 결과, 다이나믹 웹 프로젝트가 없어서 Maven Project로 만들어야 할 것 같음
(2) Maven 기반 Spring Project 설정 방법- 2. 소스 디렉토리의 경로를 Maven Convention에 맞게 수정
- test용 경로: 중요함. test를 많이 해봐야 함. TDD 개발(생산성 있는 개발) 지원
(3) Maven 기반 Spring Project 설정 방법- 3. STS로 스프링 프로젝트 생성
- Maven Project로 전환하려면 위와 같이 버튼을 클릭하고 프로젝트 명, 그룹 아이디, 버전을 설정하면 된다.
(4) Maven 사용법- 1. 의존성(Dependency) 추가
- 라이브러리의 버전을 선택해야 함
(5) Maven 사용법- 2. Spring Dependencies 추가
- 라이브러리 버전에 맞는 Dependency 태그를 mvn 센드릭 repository에서 제공해줌.
- Dependency 태그를 그대로 복사해서 다음과 같이 ‘pom.xml’ 파일의 <dependency> 태그 안에 붙여넣으면,
자동으로 라이브러리들을 관리해 줌.
4. IoC
(1) IoC(Inversion of Control 개념
- 파란색 원: 클라이언트, 초록색 원: 실제로 사용하는 객체
→ 원래 새롭게 객체 생성해서 사용해야 했는데,
IoC인 경우 객체를 사용하고자 하는 클라이언트에서 자동적으로 객체를 일정 경로로 넣어줌 (dependency injection(의존성 주입))
(2) Ioc 컨테이너
- 스프링 프레임워크 자체가 IoC 컨테이너를 포함하고 있음
- 핵심: 객체에 대한 생성 및 생명주기 관리
→ 기존 방식으로는 객체를 만들었다가 사용이 끝나면 가비지 컬렉터에서 객체가 소멸되는 과정 반복
(웹 애플리케이션은 요청이 많은 형태라 더 심각함. 요청마다 객체가 만들어진 후 소멸됨.
컨테이너 미사용 시 부하를 견디기 위해 고사양의 서버가 필요)
(3) DL(Dependency Lookup)과 DI(Dependency Injection)
- DL: Dependency Lookup
-> 스프링 컨테이너에 올라가 있는 있는 객체 중에서 우리가 사용할 객체를 클라이언트로 전달해야 함
(클라이언트 입장에서는 객체를 찾는 것)
-> 객체 ID나 TYPE으로 객체를 Lookup할 수 있음
- DI: Dependency Injection
-> 객체들은 서로 의존 관계를 가지게 되는데, 이것을 자동적으로 참조시켜 줌
(원래 A객체를 B객체에 주입시켜줘야 했음)
→ Setter, 생성자, 메소드 이름으로 Injection을 진행할 수 있음
- 빈 설정(Bean Definition) 정보: xml 형태의 파일에 들어 있음
(4) Spring IoC 관련 용어
- 자동 등록 기능: 컴포넌트 오토 스캔 + 어노테이션 기능 사용
- 컨테이너: Spring 컨테이너가 아니더라도, 빈이 모여 있는 곳이라고 생각
- Spring에서 context : Spring 컨테이너를 의미한다고 봐도 무방함.
Spring context 단어가 들어간 파일이라면(sevlet context 등) 빈이 모여있고 관리되는 Spring 컨테이너를 의미
4. DI (Dependency Injection)
(1) DI의 개념
- 각 클래스간의 의존 관계를 선언적인 방법으로 처리할 수 있음
- 디자인 패턴의 관점: 컴포넌트 간의 결합도가 제거됨. 인터페이스가 선언되어 있으면 됨. 구현체는 그때그때 다르게 주입시킬 수 있음.
(2) DI의 유형
-위의 두 가지 유형이 가장 많이 쓰임
(3) Spring DI 컨테이너의 개념 (+Bean Factory와 Application Context)
- Spring 컨테이너 = 빈 팩토리 = 어플리케이션 콘텍스트 (인터페이스)
- getBean() 메소드는 Bean Factory에서 제공
- Application Context는 Bean Factory를 상속받아서 부가서비스를 추가로 제공하는 것