본문 바로가기

Programming/[Spring]

[Spring] Spring 처음 시작



Spring Introduction


 스프링은 쉽게 말해 그냥 JSP다! JSP의 기술 중에 하나가 스프링이다. 스프링은 구조가 좀 많이 틀리다. 우선 스프링의 디렉토리 구조를 살펴보고, JSP 디렉토리 구조와는 어떤 점이 다른지 살펴볼 필요가 있다. 스프링 개발환경 설정 후에 살펴보도록 하자.


* Spring 개발환경 설정


 스프링 환경을 구성하기 위해서 2가지 방법이 있는데 1번째 방법은 이클립스에 스프링 플러그인을 설치하는 방법(Eclipse Maketplace 이용)이 있고, 2번째는 스프링 플러그인이 아예 포함이 된 이클립스 버전(Spring Tool Suite, STS)를 다운받는 방법이 있다. 이 외에도 InteliJ라는 툴도 있긴 하지만 이클립스를 많이 쓴다 cf. 안드로이드는 이클립스를 버리고 InteliJ를 쓰고 있다. 필자는 1번째 방법으로 이클립스 플러그인 설치로 STS를 깔았는데 지우고 직접 공식사이트에 다운받아서 사용하는 방식으로 진행하겠다. 우선 1번째가 설치되어 있으므로 Eclipse에서 플러그인을 삭제하는 방법부터 알아보도록 하자.




  Eclipse Plug-in 삭제 방법


 1. [Help] → [About Eclipse] 선택

 2. 하단의 [Installation Details] 선택

 3. [지우고 싶은 plug-in 선택] → [Uninstall...] 선택










 ▷ 스프링의 디렉토리 구조


 ㆍ src/main/java - 자바 코드(Controller, Model, View)

Controller => Service +>

  src/main/resources - 자바 코드에서 참조하는 리소스 파일들

 ㆍ src/test/java - 테스트 관련 코드

 ㆍ src/test/resources -테스트 코드에서 참조하는 리소스 파일들

 ㆍ src/main/webapp/resources - 웹 서비스 루트 디렉토리(외부에서 접근 가능)

 ㆍ src/main/webapp/WEB-INF/classes - 컴파일된 클래스

 ㆍ src/main/webapp/WEB-INF/spring - 스프링의 환경설정 파일

 ㆍ src/main/webapp/WEB-INF/spring/root-context.xml - 서블릿과 관련되지 않은 모든 리소스에 대한 설정

 ㆍ src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml - 서블릿과 관련된 리소스에 대한 설정

 ㆍ src/main/webapp/WEB-INF/views - html, jsp 페이지

 ㆍ src/main/webapp/WEB-INF - 외부에서 접근 불가능(보안을 위해서); 컨트롤러를 경유해서 접근 가능

 ㆍ pom.xml - 메이븐에서 참조하는 설정 파일





스프링에서는 Maven이라는 빌드 도구를 사용한다. lib에다 jar 파일들 다 넣는 거 불편하다. 이제는 jar 파일의 버전 정보만 명시하면 자동으로 다운로드하는 구조기 때문에 가볍다.

 스프링은 셋팅이 반 먹고 들어간다. 환경 설정이 정말 중요하다! 셋팅에서 상당 부분 코드가 절감된다. 현재는 셋팅 부분도 전보다 많이 쉬워졌다.

 


스프링의 주요 특징


 - POJO(Plain Old Java Object) 기반의 구성 : 별도의 API가 필요하지 않은 일반적인 자바 코드를 이용하여 개발 가능

 - 의존성 주입(DI)을 통한 객체 간의 관계 구성

 - AOP(Aspect Oriented Programming) 지원 : 반복적인 코드를 줄이고 개발자가 비즈니스 로직에만 집중할 수 있도록 지원함

 - 편리한 MVC 구조 : '좀 더 코드가 간결해진다.

 - WAS(Web Aplication Server, ex. Tomcat, 웹로직 등)에 종속적이지 않은 개발 환경

# 스프링 부트에 가면 톰캣이 들어가 있다.


1) IoC(Inversion of Control, 제어의 역전) - 객체에 대한 제어권

 - 기존에는 개발자에게 제어권이 있었음(new 연산자)

' 컨트롤러나 필터를 new를 이용해서 만든 적이 없다. 그렇다면 DAO 나 그런 것들도 서버에게 맡기면 어떨까?

 - 객체의 제어권을 스프링에게 넘김

 - 인스턴스 라이플 사이클(생성부터 소멸까지)을 개발자가 아닌 스프링 프레임웍이 담당


2) DI(Dependenct Injection, 의존관계 주입)

 - 객체 간의 의존성을 개발자가 설정하는 것이 아닌 스프링 컨테이너가 주입시켜 주는 기능



가) 의존 관계

 B의 코드가 변경되면 A의 코드도 변경되는 경우

  A와 B는 의존관계가 있다.

  A는 B에 의존한다.


A                                         B

코드 변경 발생            유연한 확장이 어려움


ex. BoardDAO.java

MemberDAO.java => 관련된 코드를 바뀌어야 함

(코드 변경 상황 시)


강한 결합과 느슨한 결합

  B의 코드 변경에 A에 영향을 미치지 않도록 느슨하게 설계


A                                         B

코드 변경 불필요            유연한 확장이 가능함

핵심 기능의 변경이 쉬워짐


강한 결합은(결합도가 높으면) 유지보수를 어렵게 함

  한 곳의 수정 -> 나비효과


제어권이 개발자한테 있던 게 스프링한테 넘어가버렸다 -> 제어권의 역전!



Spring Starter Project : 스프링 부트 설정이 거의 없고 코딩만으로 거의 작업을 하는거 요즘 최신 기술인데 실무에

서 많이 안쓴다

Spring Legacy Project :


메세지

Spring MVC 프로젝트에 관련된 파일을 받겠답니다.

라이브러리들을 다운받고 있다.


마침표가 2개 들어간 패키지명을 요구한다.