스프링 기본개념
Spring
스프링 퀵스타트를 이용해서 스프링 기초를 연습하는 글입니다.
프레임워크
프레임워크란 뼈대 혹은 틀로서 소프트웨어 관점에서 접근하면 아키텍처에 해당하는 골격 코드이다.
아키텍쳐 일관성
- > 골격코드 제공
장점
- 빠른 구현시간
- 쉬운관리
- 개발자들의 역량 획일화
- 검증된 아키텍처의 재사용과 일관성 유지
Spring 프레임워크
특징
- 경량(Lightweight)
POJO형태의 객체 관리 - 특별한 규칙이 없는 단순하고 가벼운 객체 사용
cf) 토막 상식POJO (Plain Old Java Object) vs EJB(Enterprise Java Beans)
POJO를 이해 하기 전 POJO라는 단어가 만들어진 역사적 배경을 살펴볼 필요가 잇다. POJO는 마틴 파울러가 2000년 가을에 열렸던 어느 컨퍼런스의 발표를 준비하면서 처음 만들어낸 말이다. 마틴 파울러는 EJB(Enterprise JavaBean)보다는 단순한 자바 오브젝트에 도메인 로직을 넣어 사용하는 것이 여러가지 장점이 있는데도 왜 사람들이 그 EJB가 아닌 ‘평범한자바 오브젝트’를 사용하기를 꺼려 하는지에 대해 의문을 가졌다. 그리고 그는 단순한 오브젝트에는 EJB와 같은 그럴듯한 이름이 없어어서 그 사용을 주저하는 것이라고 결론 내렸다.
그래서 만든 단어가 POJO라는 용어인 것이다. POJO기반의 기술을 사용한다고 말하면 왠지 첨단 기술을 사용하는 앞선 개발자인 듯한 인상을 주기 때문인다.
POJO기반의 프로그래밍 기술이 EJB의 강력한 대안으로 등장했고 ,POJO 기반 프레임워크 ,POJO 애플리케이션을 위한 플랫폼 등이 점점 인기를 끌게 되었고, 결국 POJO가 배제하려고 했던 EJB는 POJO기반의 기술에 밀려 이제 레거시 기술로 사라질 위기에 처했다. 그렇다면 단지 EJB를 사용하지 않으면 모두 POJO라고 할 수 있을까? 그렇지 않다. POJO프로그래밍이라는 개념은 단지 “EJB가 아닌 자바”이상의 특징을 가지고 있는 프로그래밍 모델이다. POJO기반의 개발은 생각보다 단순하지 않다.
POJO를 좀더 이해하려면 EJB의 장단점을 함께 이해해야 한다. 그것은 POJO 프로그래밍이 다시 EJB시대이전으로 돌아 가자는 것이 아니고 ,EJB를 넘어 그보다 더 앞으로 나아가자는 것이기 때문이다.
EJB를 사용하지 말고 POJO를 쓰자는 것은 EJB이전의 방식으로 돌아 가는 것을 의미한다면 또 다른 문제가 발생 할 수 밖에 없다. 여전히 복잡한 로우레벨의 API를 이용해 코드를 작성해야 하고, 많은 기술적인 문제를 애플리케이션 코드에 그대로 노출시켜 개발해야 한다면 기껏 POJO로의 복귀 덕분에 얻는 많은 장점들을 놓칠 수 밖에 없다.
그래서 등장한 것이 POJO 기반의 프레임워크이다. POJO프레임워크는 POJO를 이용한 애플리케이션 개발이 가진 특징과 장점을 그대로 살리면서 EJB에서 제공하는 엔터프라이즈 서비스와 기술을 그대로 사용할 수 있도록 도와주느 프레임워크이다. 나아가 이는 기존의 EJB에서보다 훨씬 더 세련되고 나은 방법이다.
cf) Not POJO? -> Servelt
- javax.servelt, javax.servelt.http 패키지를 import 해야한다.
- public 클래스로 선언해야한다.
- Servelt, GenericServelt, HttpServelt 중 하나를 상속 받아야한다.
- 기본 생성자(Default Constructor)가 있어야한다.
- 생명주기에 해당하는 메소드를 재정의(Overriding)한다.
비지니스 컴포넌트를 개발할 때 낮은 결합도
,높은 응집도
이 두가지가 중요
- IoC(Inversion of Control) - 제어의 역행
스프링 프레임워크는 IoC를 통해 낮은 결합도
유지
IoC를 통해 객체 생성을 자바코드로 직접 처리하는 것이 아닌 컨테이너가 대신처리
객체와 객체 사이이 의존관계를 컨테이너가 처리
-> 소스에 의존관계가 명시되지 않으므로 곃합도가 떨어져 유지보수가 편리해진다.
- AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍
핵심 비지니스 로직과 각 비지니스 메소드마다 반복해서 등장하는 공통로직을 분리함으로써 개발의 높은 응집도
지원
- 컨테이너
컨테이너 : 특정 객체의 생성과 관리를 담당 / 객체 운용의 필요한 다양한 기능을 제공
객체를 생성하고 객체 간의 의존관계를 관리하는 점에서 스프링도 일종의 컨테이너
이다.
스프링 컨테이너 종류
- BeanFactory
객체를 생성하고 관리하는 가장 기본적인 컨테이너 제공
cf) 클라이언트의 요청에 의해서만
- ApplicationContext
객체 관리 이외에 트랜잭션 관리나 메시지 기반의 다국어 처리 등 다양한 기능 제공한다.
어노테이션
어노테이션은 클래스나 메서드, 변수 등의 메타 데이터, 데이터의 정의를 설정하는 데이터
라고 할 수 있습니다.
즉, 어노테이션의 데이터로는 실제 데이터를 적용하는 것은 아니고, 클래스, 메서드, 변수를 구분하기 위한 데이터라고 할 수 있습니다.
- @Autowired : 주로 변수 위에 설정항 해당타입이 객체를 찾아서 자동으로 할당
- @Qualifier : 특정 객체의 이름을 이용하여 의존성을 주입할 때 사용
- @Inject : @Autowired 와 동일
- @Resource : @Autowired @Qualifier의 기능을 결합
- @Service : 비즈니스 로직을 처리하는 Service 클래스
- @Repository : 데이터베이스 연동을 처리하는 DAO 클래스
- @Controller : 사용자 요청을 제어하는 Controller 클래스