개발/KH국비지원과정

[KH국비지원 웹개발자 과정] Day_57 키워드, 메이븐,스프링(Spring) 프레임워크

mabb 2022. 9. 5. 23:01
반응형

 해당 포스팅은 강의 복기용으로 키워드를 기록하는 용도의 포스팅입니다.
--------------------------------------------------------------------------------------------------

 메이븐 프로젝트는 자바용 프로젝트 관리 도구이다.
XML문서로 프로젝트의 버전 정보 및 라이브러리 정보들을 통합하여 관리하는 프로젝트 관리 도구.

다이나믹 웹 프로젝트를 사용할 때는 필요한 라이브러리를 추가할 때마다
lib 폴더에 jar 파일을 추가하여야만 했다.

이 자체로도 번거로운 일인데 만약에 여러명이 협업을 하는 상황이라면 라이브러리를 추가하는 등의 프로젝트
셋팅이 굉장히 번거로울  것이다.

메이븐 프로젝트는 POM.XML에 설정을 해주는 것 만으로 이러한 불편함을 해소할 수 있다.
메이븐 다운로드는 압축을 풀고 이클립스와 연동하는 것.

POM (Project Object Model)
DOM(Document Object Model) BOM(Browser Object Model) 처럼 객체모델이라고 이해해봄.

XML(eXetensible Markeup Language) 확장가능한 마크업 언어 파일.

메이븐 프로젝트는 POM.XML 파일에 Dependency 태그를 추가하는 것만으로 라이브러리가 자동으로 추가된다.
메이븐프로젝트는 메이븐의 로컬저장소에 jar파일이 없을 경우 원격저장소(메이븐 리포지토리) 에서 해당 jar파일과 더불어
관련된 다른  jar파일들도 다운받는다. -> 굉장히 편리한 점.

프레임워크는 일종의 반제품이라고 이해

스프링 프레임워크는
IoC와 DI라는 핵심 개념을 기반으로 개발자들이 편하게 가져다 쓸 수 있는 약 20여개의 모듈을 지원하는 프레임워크이다.
스프링 프레임워크의 좋은점은 이러한 기능들을 다 알아야 사용할 수 있는 것이 아니라
기본 핵심 개념 (DI, IoC, AOP등) 을 익히고 나서는 필요한 모듈을 개별로 가져다 쓸 수 있다는 것이다.\

스프링 설치 (STS)
STS (Spring Tool Suite)
Spring Framework를 사용하기위한 툴.
이클립스에서 다운로드가 가능하다.
Help - 이클립스 마켓플레이스에서 다운로드.

 

스프링 프레임워크를 이용하는 이유에 대해서는
중복되는 코드를 줄이고 유지보수를 편리하게 하는 관점으로 이해를 해보았다.

IoC( Inversion of Control) ,제어의 역전.
: 객체의 생성, 변경 등의 관리를 개발자가 아닌 컨테이너가 대신하는 것.
컨테이너는 서블릿 컨테이너(톰캣)을 생각하면 이해하기 쉽다.
request, response같은 객체가 이미 컨테이너가 만들어 놓은 객체를 가져다 쓴 것이다.

객체를 생성하는 것
Car car = new Car();
스프링을 사용하면 이제 이렇게 직접 객체를 생성하지 않을 수 있다.

개발자가 객체로 만들 클래스들을 미리 알려주면(설정해주면)
프로그램 실행 시 스프링은 이 객체들을 미리 객체로 만들어 메모리에 올린다.

개발자가 필요한 순간에 new연산자를 이용하여 객체를 생성하는 것이 아니라
설정해놓은 클래스들을 스프링이 미리 객체로 만들어 메모리에 올려놓는 것이다.
이렇게 개발자가 설정한 클래스를 가지고 스프링 컨테이너가 생성하는 객체를
bean객체라고 한다. bean팩토리에 bean을 등록한다고 함.

Bean의 세가지 조건 / 조건을 맞춰야 컴퓨터가 사용할 수 있다.
1. 기본 생성자 필수
2. private 필드 필수
3. 게터세터 메소드를 가진다. ( getName() setName() -> name프로퍼티라고한다)

단, 이러한 객체들은 기본적으로 싱글톤으로 생성이 된다. 메모리에 올려놓은 객체를 필요할 때마다 새로 만드는 것이 아님. 

객체로 만들 클래스를 설정하는 방법은
1. XML을  이용하는 방법
2. 어노테이션을 이용하는 방법
3. java config 파일을 이용하는 방법
이 있다.

그렇다면 이렇게 스프링 컨테이너가 대신 만들어서 메모리에 올려놓은
bean 객체들은 어떻게 사용해야 할까?

1.객체 공장에서 가져오기.
ApplicationContext 인터페이스의 구현클래스들
예를 들면 new GenericXmlApplicationContext("설정한 XML파일") 등을 이용하여 
getBean("bean객체 이름") 메소드로 bean 객체를 가져올 수 있다.

Spring의 Ioc/DI 컨테이너 두가지
1. BeanFactory : 기본 기능/ 너무 간단기능
2. ApplicationContext: BeanFactory의 모든 기능을 포함하며 트랜잭션, AOP, BeanPostProcessor, BeanFactoryPostProcessor,국제화처리 어플리케이션이벤트 등을 처리할 수 있다.
-> ApplicationContext를 사용한다.

그런데 이렇게 매번 가져다 쓴다면 객체를 미리 bean으로 메모리에 올려놓았다는 점 말고는
new 연산자로 생성하는 것 대비 그렇게 편리하지 않은 것 같다.

2. 만들어 놓은 bean객체를 필요한 곳에 주입한다.

DI( Dependency Injection), 의존 주입

의존이란 무엇인가.
먼저 클래스끼리의 관계를 생각해보면
Generalization : 일반화관계, 상속관계
Realization : 실체화관계, 구현관계
Association: 연관관계, 멤버변수(필드)에서 다른 객체를 참조하는 관계. 다른 객체를 필드로 쓰는 것
  Composition: 다른 객체를 해당 객체 내에서 new연산자를 이용하여 생성하는 강한 결합관계. 라이프사이클이 같다.
  Aggregation: 다른 객체를 해당 객체 내에서 생성하지 않고 매개변수 등으로 주입받아 사용한다. 라이프사이클이 다르다.

Dependency: 의존
 :메소드 내에서 다른 객체의 메소드를 사용하는 것.
 :변경에 의해 영향을 받는 관계. 메소드 내에서 사용하는 다른 객체의 클래스명, 메소드명 등이 바뀐경우 같이 수정해주어야함. 클래스 다이어그램에서 의존관계는 메소드 실행 시에만 관계를 맺는 관계로 이해했었음. Association에 비해 짧은 인연.

유지 보수의 관점에서 의존을 한다는게 좋은 것은 아님.
서로의 종속이 강하면 유지보수나 관리에 어려움이 있다.
한 객체를 다른 100개의 객체에서 의존할 경우 그 한 객체가 변경될 경우
모두 수정을 해주어야함.

Composition의 강한결합을 Aggregation의 약한 결합으로 하는 것.
-> 객체를 매개변수로 주입해준다는 의미.

스프링에서는 생성한 bean객체를 주입하는 설정도 할 수가 있음.
필드나
생성자나
setter 메소드
메소드의 매개변수
에 생성해 놓은 bean 객체를 주입할 수가 있는 것.

정리해보자면

1.개발자가 객체로 만들 클래스를 설정하면(알려주면)
2. 컨테이너는 설정된 클래스를 bean객체로 만들어서 메모리에 올린다.
3. 개발자가 메모리에 올린 bean객체를 주입하는 설정을 하면
4. 스프링이 알아서 주입할 자리에 만들어놓은 객체를 주입한다.

<강한결합>
public class Car{
 private Tire tire;

public Car( ){
 tire = new TIre();
 }
}

<약한 결합>
public class Car{
 private TIre tire;

public Car(Tire tire){
 this.tire = tire;
}

단, Car생성자를 사용하는 곳에는
Tire tire = new Tire(); 가 있을 것임.

<스프링을 사용하면>
public class Car{
@Autowired
 private Tire tire;
}

이러면  만들어 놓은 bean객체 중
Tire 타입인 bean객체를 tire에 주입한다.

의존관계를 주입하는 방법
1. xml 설정
<bean> 하위 태그인
<property> 태그를 이용하는 방법- setter 주입
<constructor-arg>태그를 이용하는 방법- 생성자 주입
ref = "tire" - 참조변수를 주입함
value = "문자열입니다" - 값을 주입함
<bean id = "car" class = "kr.co.Car">
  <property name="tire" ref="tire"></property>
</bean>

2. 어노테이션 설정
 1) @Autowired : 생성한 bean객체들 중 맞는 타입을 자동으로 주입
 2) @Resource : 생성한 bean객체들 중 이름이 같은 경우 자동으로 주입
 3) @Value : 단순한 값을 주입할 때 사용하는 어노테이션.

Bean 등록 어노테이션
@Component
@Repository
@Service
@Controller

 

반응형