- JAVA로 다양한 어플리케이션을 만들기 위해개발을 더 쉽게 할 수 있도록 도와주는 프레임워크
- 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공(jsp, MyBatis, JPA 등등)
- 전자정부 표준 프레임워크의 기반 기술로서 쓰이고 있다.
- 중복코드 사용률을 줄이고 비지니스 로직을 더 간단하게 해주며, 오픈소스를 좀 더 효율적으로 가져다 쓸 수 있음.
🍀스프링의 특징
˙ 경량 컨테이너로서 자바 객체를 직접 관리한다.
˙ POJO(Plain Old Java Object) 방식의 프레임워크
- POJO : 단순하고 가벼운 자바 객체(우리가 자바에서 개발하는 지극히 평범한 객체)
˙ IoC(Inversion of Control; 제어 반전) 지원
- 필요에 따라 컨트롤의 제어권을 사용자가 갖지 않고 스프링에서 사용자의 코드를 호출
˙ DI(Dependency injection; 의존성 주입)를 통한 객체 간의 관계 구성
˙ AOP(Aspect-Oriented Programming; 관점 지향 프로그래밍) 지원
˙ 영속성과 관련한 다양한 서비스 지원
- iBATIS, 하이버네이트 등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스 제공
˙ 확장성이 높다.
- 수많은 라이브러리가 스프링에서 지원되고 있기 때문에 사용에도 라이브러리를 별도로 분리하기도 용이하다.
🍀스프링의 개발을 더 쉽게 해주는 기술들
1. POJO(Plain Old Java Object) 방식
- POJO는 Java EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하여 나타난 용어이다. - 별도의 프레임 워크 없이 Java EE를 사용할 때에 비해 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기 용이하고, 객체가 가볍다. - 즉, getter/setter를 가진 단순한 자바 오브젝트를 말한다.
기존에는 프레임워크가 너무 무겁고 내용도 방대했다. 이러한 니즈를 충족하기 위해 경량 프레임워크인 스프링이 등장했다. 기존에 Java EE의 경우 미리 설계되어있는 인터페이스나 클래스를 상속받아서 무거운 객체들을 만들어야만 했는데, Spring은 일반적인 java 코드만으로 객체를 구성할 수 있게 된다. 따라서 더 유연하고 가볍게, 생산성을 높이며 프로그래밍이 가능해진다.
모든 자바 플랫폼들은 자바 가상 머신(JVM)과 API로 구성되어 있다. JVM이 어플리케이션을 동작시키기 위한 프로그램이고 API는 개발에 필요한 함수들을 패키지로 묶어서 배포한다.
기본은 JAVA SE가 스탠다드라는 이름 답게 흔히 많이 쓰는 java.lang.*, java.io.*, java.util.* 등등 java 프로그래밍 언어를 배울때 사용하는 대부분의 패키지를 포함한다.
그렇다면 JAVA EE는 뭘까? JAVA SE 위에 구축된 버전으로 대규모, 다계층, 확장 가능한 특징이 있으며 대규모일 때 안정적이고 안전한 네트워크 애플리케이션을 개발 및 실행하기 위한 API를 추가로 포함한다. JAVA EE가 servlet, JSON, REST API, 웹소켓 등을 지원한다.
근데 이를 대규모로 지원하려다보니 용량도 크고 포함한 패키지가 많아서 속도가 느려지기도 한다는 말이다.
2.IoC(Inversion of Control, 제어 반전)
Spring에 가장 핵심적인 기능. 한마디로알아서 해주는 비서가 하나 생겼다.
개발자는 JAVA 코딩시 new 연산자, 인터페이스 호출, 데이터 클래스 호출 방식으로 객체를 생성하고 소멸시킨다.
IoC란 인스턴스 (객체)의 생성부터 소멸까지 객체 생명주기 관리를 개발자가 하는게 아닌 스피링(컨테이너)가 대신 해주는 것을 말한다.
IoC는 개발자가 실수할 수 있는 생명주기 관리를 대신 해준다. 프로젝트 규모가 커질수록 객체와 자원을 이용하는 방법이 더 복잡해져 코드가 꼬일 수 있는데 이를 Spring의 IoC가 대신 자동 관리해준다.
ex) Spring IoC Container 에 Bean으로 등록된 것들을 의존성 주입하기 위해 어노테이션 @Autowired를 사용한다.
단, 제어권은 개발자가 아닌 IoC에게 있으며 IoC가 개발자의 코드를 호출하여 그 코드로 생명주기를 제어한다.
3.DI(Dependency Injection, 의존성 주입)
프로그래밍에서구성요소 간의 의존 관계가 소스코드 내부가 아닌외부의 설정파일을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다.
쉽게 말하자면 게임 캐릭터라는 하나의 객체가 존재하는데, 그 객체를 더 잘 이용하기 위해서 무기, 방패 등 아이템을 가져와 결합시키는 것이다.이 객체는 무기와 방패를 뺐다 꼈다 자유자재로 할 수 있으며아이템을 갈아끼우는데 어떤 상황에 구애받지도 않는다.(그리고 그 아이템을 갈아끼우는걸 IoC Container가 해준다.)
JAVA에서 데이터를 저장하고 가져오는 기능을 외부의 Oracle Database를 사용할 수도 있고, JDBC, iBatis, JPA 등 다른 프레임 워크를 이용해 짤 수도 있다. 이때 Spring을 이용하면 그때마다 필요한 부분을 뺐다 꼈다 하면서 적절한 상황에 필요한 기능을 해낼 수 있다.
▼ Spring은 DI를 지원하는 조립기다. 의존성 주입을 지원하는 방식은 크게 3가지이다.
생성자를 통해 의존성을 주입하면 한번 장착한 타이어는 더 이상 타이어를 교체할 수 없다는 문제점이 존재한다. 운전자가 원할 때 타이어를 교체하고 싶다면 setter 의존성 주입을 사용해야 한다.
3) 필드 주입
생성자 의존성 주입을 할 때도 생성자에 실수로 필드를 적지 않을 수 있다. 이러면 컴파일 에러가 발생하지 않기 때문에.. 테스트 코드를 실행해보기 전까지는 알 수 없다.
그래서 이러한 경우를 사전에 방지하고자 필드에 final 키워드를 사용하는 것을 권장한다. final 키워드가 붙어있는데 생성자에 초기화 되지 않는다면 컴파일 에러가 발생하기 때문에 개발자의 실수를 사전에 막을 수 있다는 장점이 있다.
4.AOP(Aspect Object Programming, 관점 지향 프로그래밍)
AOP : 관점별로 나눠 모듈화해서 필요할때마다 끼워쓴다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화하는 방법이다. 즉, 코드를 부분적으로 나눠서 중복되는 코드들을 Aspect(관점별로)를 이용해서 모듈화한(=묶는)다.
로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리 할 수 있다.
각각의 클래스가 있다고 가정하자. 각 클래스들은 서로 코드와 기능들이 중복되는 부분이 많다. 코드가 중복될 경우 실용성과 가독성 및 개발 속도에 좋지 않다. 중복된 코드를 최대한 배제하는 방법은 중복되는 기능들을 전부 빼놓은 뒤 그 기능이 필요할때만 호출하여 쓰면 훨씬 효율성이 좋다.
즉, AOP는여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법이다.
5.PSA (Portable Service Abstraction, 일관된 서비스 추상화)
환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조를 의미한다. POJO 원칙에 따라 가벼워지고 생산성이 높아진 Spring은 PSA 방식으로 추상화가 되어있어 가능하다.
Java Framework에서 사용 가능한 라이브러리들은 다양하지만 각자의 사용 방법이 다르다. 만약 MySQL 사용하던 시스템에서 DB를 Maria DB로 변경한다면 기존 소스를 일일히 수정해줘야 하지 않겠는가? 이럴 때 Spring을 사용하면 동일 사용방법을 유지한 채로 DB를 변경할 수 있다.Spring이 데이터베이스 서비스를 추상화한 인터페이스를 제공해주기 때문이다.(이 경우 Java를 이용해서 DB에 접근하는 방법을 규정한 인터페이스를JDBC라고 한다.)
쉽게 말해중간 어댑터(Adapter)가 하나 있는 것이다.같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한다.
🍀Spring MVC 구조
모델-뷰-컨트롤러 패턴 : 소프트웨어 디자인 패턴 중 하나
M (Model) / V (View) / C (Controller)
Model: 어플리케이션의 정보나 데이터, DB 등을 말합니다.
View: 사용자에게 보여지는 화면, UI를 말합니다. 모델로부터 정보를 얻고 표시합니다.
Controller: 데이터와 비즈니스 로직 사이의 상호 동작을 관리합니다. 즉, 모델과 뷰를 통제합니다. MVC 패턴에서 View와 Model이 직접적인 상호 소통을 하지 않도록 관리합니다.
MVC 패턴은 크게 MVC 1 패턴과, 스프링이 채택한 MVC 2 패턴으로 나눌 수 있습니다.
MVC1
MVC1 패턴의 경우View와Controller를 모두 JSP가 담당하는 형태를 가집니다. 즉JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽습니다.
단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고 거대해질수록 이 패턴은 힘을 잃습니다. JSP 하나에서 MVC 가 모두 이루어지다보니재사용성도 매우 떨어지고, 읽기도 힘들어집니다. 즉 유지보수에 있어서 문제가 발생합니다.
MVC2
MVC2 패턴은 널리 표준으로 사용되는 패턴입니다. 요청을 하나의 컨트롤러(Servlet)가 먼저 받습니다.즉 MVC1과는 다르게 Controller, View가 분리되어 있습니다. 따라서 역할이 분리되어 MVC1패턴에서의 단점을 보완할 수 있습니다. 그러므로개발자는 M, V, C 중에서 수정해야 할 부분이 있다면, 그것만 꺼내어 수정하면 됩니다.따라서 유지보수에 있어서도 큰 이점을 가집니다.
MV2는 MVC1 패턴보다 구조가 복잡해질 수 있지만, 개발자가 이러한 세부적인 구성까지 신경쓰지 않을 수 있도록 각종 프레임워크들이 지금까지 잘 발전되어 왔습니다. 그 중에서 대표적인 것이 바로 스프링 프레임워크입니다.
스프링 프레임워크 MVC2 패턴
스프링에서는유저의 요청을 받는 DispathcerServlet이 핵심입니다. 이것이 Front Controller의 역할을 맡습니다.
Front Controller(프런트 컨트롤러)란, 우선적으로 유저(클라이언트)의 모든 요청을 받고, 그 요청을 분석하여 세부 컨트롤러들에게 필요한 작업을 나눠주게 됩니다.
즉,Front Controller는
1. 클라이언트 요청에 맞는 Controller 클래스에 매핑해주는HandlerMapping에게 검색을 요청하고 =>"야 찾았어!"
2. 위에서 매핑된Controller가 비지니스 로직을 수행하고 =>"일하는중"
3. 로직을 수행한 결과물들을 가지고 있는ViewResolver에게 "이런 이름을 가진 view를 줘" 라고 요청하고 =>"결과물 여기"
4.ViewResolver에게 받은 알맞은 결과물을 클라이언트에게 결과화면으로 리턴합니다. =>"니가 원하던거 줄께"
와 같은 역할을 하게 됩니다.
스프링 부트 프레임워크 (Spring Boot Framework)
🍀 스프링 부트(Spring Boot) 란?
스프링이 기존 기술에서 복잡성을 줄인 프레임워크지만, 그럼에도 불구하고 사용 시 여러 사항들을 설정해줘야 한다.
Spring Boot는 이러한 설정 내용을 간략히 줄여준 프레임워크다. 그렇게 될 수 있는 이유는Spring Boot가 기존의 복잡한 설정을 대신 해주기 때문이다.
Spring Boot는 자체적인 웹 서버를 내장하고 있어, 기존 스프링보다 빠르고 간편하게 배포할 수 있다. 또한 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어, 클라우드 서비스 및 도커와 같은 가상화 환경에도 빠르게 배포 가능하다.
사용자 또는 프로그램이 사용하던 정보나 숫자 값을 특별한 가공 없이 그대로 파일에 저장한 파일.
우리가 많이 사용하는 .jpg, png 같은 그림파일이나 음악파일(.mp3), 실행파일(.exe) 등 다양한 실행가능 파일들이 바이너리 파일에 해당된다.
따로 우리가 읽을 수 있게 가공된 것이 아닌 그 파일 자체이므로, 우리가 읽을 수 있게 가공된, 예컨데 "우리가 쉽게 볼 수 있게끔 맨 첫번째 줄 데이터를 읽어라" 같은 명령어가 듣지 않는다. 바이너리 파일은 "10바이트를 읽어라 " 등 크기를 지정해서 읽을 수있다. 이러한 특징때문에 바이너리 파일은 따로 내용을 확인하려면 해당 파일을 볼 수 있는 프로그램이 별도로 필요하다.(윈도우에는 기본적으로 사진 읽는 프로그램, 문서 프로그램 등을 지원한다.)
톰캣 9.0 다운로드
2. D드라이브에 새로운 workspace 설정하기
D드라이브에 폴더 만들어서 거기로 하자.
1번에서 깔았던 톰캣도 bogdata 폴더에 넣어주었다.
3. 새로운 프로젝트 생성
File -new- dynamic web project - spring_django_1026(프로젝트 이름)
Static Web Project : JSP와 같은 동적인 페이지가 없는 순수하게 웹 컨텐츠로만 구성되어 있는 웹 컨텐츠를 위한 프로젝트
Dynamic Web Project : JSP와 같이 동적인 웹페이지를 가지는 웹 애플리케이션 개발 시에 사용하는 프로젝트
Web fragment Project : 다른 웹 프로젝트에 하나의 라이브러리와 같은 형태로 재사용될 때 유용하다. 해당 프로젝트의 output은 jar파일로 생성되어 다르웹 프로젝트에 추가될 수 있다. web fragment는 하나의 논리적인 웹 애플리케이션의 파티션이라고 볼 수 있다.
Spring / STS(Spring Tool Suite) = Java Project + Dynamic Web Project
Spring Starter Project : Standalone / 웹 환경에 함께 사용하며 Spring Boot기반의 Application
Spring Legacy Project : 일반적인 Spring Framework 프로젝트, 필요에 따라 Spring Framework의 라이브러리를 내장하여 이용
<Template 종류 -구조 차이>
Simple Java : 최상위 패키지없이 기본 Spring 구성 및 Java빌드를 사용하여 간단한 Spring 프로젝트를 작성
Simple Spring Maven : Spring 라이브러리의 기본 세트를 포함하는 Maven을 사용하여 간단한 Spring 프로젝트를 생성
Simple Spring Web Maven : MVC 구조 + Maven
Simple Spring Utility Project : Maven Dependencies에 Spring 관련 jar 설정, 약간의 샘플 포함
Spring MVC Project : 기본적으로 MVC형태로 Maven, 여러가지 라이브러리들이 셋팅되어 생성 , 가장 많이 사용
#Spring MVC Project(약 47바이트)가 Simple Spring Web Maven(약 15바이트)에 비해 용량이 2.5배 이상 더 나감
원래 서버는 자동으로 생긴다. VM ware가 생기지만 우리는 tomcat을 사용하겠다. (1번에서 설치한 것)
Dynamic web module version: 서블릿 버전. 이클립스는 여기에 지정된 버전으로 소스 코드의 문법을 검사한다.
Source folders on build path: Java 소스 폴더
Default output folder: 컴파일 결과 출력 폴더
Context root: 웹 어플리케이션 이름. 기본값은 프로젝트 이름이다. 서버에 자동 배치할 때 이 이름으로 폴더를 만들어 배치한다. 웹 브라우저에서 실행을 요청할 때 여기에 지정된 이름을 URL에서 사용한다.
Content directory: 웹 콘텐츠 파일을 저장할 작업 폴더의 이름을 지정한다. 서버에 자동 배치할 때 이 폴더의 내용물을 서버의 배치 폴더로 복사한다. 폴더의 이름은 어떤 것이든 상관 없으나 협업 시 다른 개발자가 알아보기 쉽도록 가능한 기본 이름을 사용한다.
Generate web.xml deployment descriptor: 웹 어플리케이션 배치 설명서 파일을 자동으로 생성하는 옵션이다. 프로젝트의 WEB-INF 폴더에 web.xml 파일이 자동으로 생성된다.
디렉토리 및 파일
설명
src
Java 소스 파일, 프로퍼티(.properties) 파일이 위치하는 디렉토리
build
자바 클래스 파일(.class)이 위치하는 디렉토리 Project Explorer에서는 기본적으로 class 파일은 보이지 않게 숨기므로 안의 내용은 보이지 않는다.
WebContent
HTML(.html), CSS(.css), JavaScript(.js), JSP, 이미지 파일 등의웹 콘텐츠가 위치하는 디렉토리 웹 어플리케이션을 서버에 배치할 때 이 폴더의 내용물이 그대로 복사된다.
WebContent/WEB-INF
웹 어플리케이션 설정 관련 파일들이 위치하는 디렉토리 이 폴더에 있는 파일은 클라이언트에서 요청할 수 없다.
WebContent/WEB-INF/web.xml
웹 어플리케이션Deployment Descriptor(배치 설명서, DD파일이라고도 함) 서블릿, 필터, 리스너, 매개변수, Welcome Pages 등의 웹 어플리케이션 컴포넌트 배치 정보를 작성한다. 서블릿 컨테이너는 클라이언트의 요청을 처리할 때 이 파일의 정보를 참고하여 서블릿 클래스를 찾거나 필터를 실행하는 등의 작업을 수행한다.
소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물.
우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.
이러한 빌드를 위해 빌드 도구가 생겼는데, 프로젝트의 생성, 테스트빌드, 배포 등을 위한 프로그램이다. 코드가 복잡해지면서 라이브러리가 계속해서 늘어나고 버전 동기화가 어려워 지는 것을 해결하고자 만들어졌다. 초기 자바의 빌드도구로 Ant를 많이 사용했지만 요즘은 Maven을 사용한다.(또는 Grandle이 많이 쓰임.)
Maven 이란?
메이븐 ( Maven )은war 또는 jar 파일을 빌드( build ), 라이브러리 의존성( dependency ) 해결, 컴파일( compile ) , 배포 ( deploy ) 등 프로젝트의 전체적인 라이프 사이클을 관리하는 도구이다.
Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다. Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다. 따라서 전반적인 프로젝트 관리 기능을 포함한다.
Gradle이란 기본적으로 빌드 배포 도구(Build Tool)이다. 안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다. 빌드툴인 Ant Builder와 같이 그루비 스크립트를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하다.
기본 Maven의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있다.
장점으로는 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능하다.
Maven vs Grandle
Maven은 xml 기반을 사용하고 있지만Gradle은 자바스크립트 기반.
Maven에는 Gadle과 비교문서가 없지만, Gradle에는 비교문서가 있다.
Gradle이 시기적으로 늦게 나온만큼 사용성, 성능 등 비교적 뛰어난 스펙을 가지고 있다. Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다. Gradle은 그루비를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다. Gradle은 메이븐보다 최대 100배 빠르다.
Maven의 익숙함이 아니라면 효율은 진작에 Gradle이 이기고 있다.
(안드로이드는 Gradle로 이미 바뀌었다.)
협업과 러닝커브를 고려하여 여전히 Maven을 사용하는 팀이 많고 부족함 없이 잘 사용하고 있지만, 빌드타임 비용문제로 이어질경우 Gradle을 사용해야 할 것 같다. 왜냐하면 Gradle이 Maven보다 최대 100 배 빠르기 때문이다.
groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.
artifactId : 프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다. Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 bospring_django_1026-0.0.1-SNAPSHOT.war 파일이 생성된다.
version : 프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용 packaging : 패키징 유형(jar, war, ear 등)
표준 프레임워크 포털에 들어가보면, 현재 3.9까지 릴리즈 되었다. 곧 4.0 시대가 오기 때문에 내년이면 4.0의 버전을 표준으로 지정할 것이다. 정부사업 등등에서 많이 이용하겠지.(5는 jpa 베이스. 아직 현업에서 쓰지는 않음.)
3.0(Java5지원)
전체 프레임워크를 하나의spring.jar 파일로 제공하던 부분을 여러개의 jar 파일로 나누어 제공
SPEL(Spring Expression Language)가 도입되었다.
Rest API에 대한 지원이 추가되었다.
OXM(Object Xml Mapping)기능이 추가되어 설정을 Xml 형태로 할 수 있게 지원
Java annotation을 이용해서 DI의 지원이 가능하다.
4.0(Java8지원)
Starter Pack이 생겨서 초보 개발자들에게 큰 진입장벽인 POM 설정을 도와준다.
기존에 사용하지 않지만 호환성을 위해 남겨져있던Deprecated Package들이 제거되었으며Hibenate3.6 이상,Ehchache 2.1이상,Groovy 1.8이상,Joda-Time2.0 이상 등 새로운Dependency들에 대해 지원한다.
Java6,Java7,Java8의 고유 기능들에 대해 지원한다.람다식,Optional,Callback Interface등의 기능을Spring Framework레벨에서 사용할 수 있다.
Java EE6, 7에 대해 고려되어 있다.JPA 2.0과Servlet 3.0에 대한 지원이 포함되어 있다는 뜻이다.
Groovy를 이용한Bean설정이 가능하다. 자세한 사용법은GroovyBeanDefinitionReader문서를 참조하다.
Core 컨테이너들의 기능 지원이 확대되어있다. 먼저 Repository 들이 좀 더 쉽게 Inject될 수 있으며, 각종Metadata Annotation들을 이용한Custom Annotation작성이 가능하다.@Lazy를 이용한 Lazy Injection이나 @Order을 통한 Ordered Interface,@Profile을 통한 프로필 버전 관리가 쉬워졌다.
Web을 개발하기 위한 도구들이 생겼다.@RestController같은 것들이 그것이다.
Web Socket이나STOMP등의 프로토콜을 같이 지원한다.
테스트 환경이 개선되었다. Framework 레벨에서Mock을 위한ServletContext를 별도로 지원한다.
5.0(JDK 8+, 9 지원, Java8을 표준으로 사용)
코어로직에 있어서JDK8의 특징들이 강화되었다.
HTTP 메시지 코덱의XML과JSON지원에 대한 구현이Encoder와Decoder의 사용을 통해 추상화되었다.
웹에 대한 지원이 향상되었다. 특히Protobuf 3.0지원이 적용되었다.
3.0베이스면 lagercy를 쓸 수 있다. 단, 그러면 xml같은 것을 다 수동으로 수정해줘야 한다.
자바(JAVA)를 이용해 오라클에 생성해둔 테이블에 접근해 원하는 정보를 구할 수 있다. 오라클 사이트에서 자바와 오라클 데이버베이스의 연동을 위한 ojdbc 라이브러리를 제공하고 있고, ojbc의 클래스와 메소드들을 이용해 데이터베이스에 접근해 데이터를 받아올 수 있다.
ojdbc13 : jdk1.3
ojdbc14 : jdk1.4
ojdbc5 : jdk1.5
ojdbc6 : jdk1.6
jdbc Driver설정을 할때 현재 자신이 사용하는 jdk버전에 맞는 ojdbc.jar를 사용해야 한다.
보통 오라클 10은 ojdbc14.jar를 사용하고 11g는 ojdbc.jar로 사용한다고 한다.
클라이언트로부터의 요청을 받으면DispatcherServlet에서 HandlerMapping을 통해Controller로 위임 처리하게 된다. 위임 처리 받은Controller는 비즈니스 로직을 처리 후 ViewResolver를 통해View로 데이터를 전달하게 해준다.
원래 Controller에서 view에 있는 jsp 파일을 연결해주려면, "/WEB_INF/hello.jsp" 와 같이 view의 전체 경로를 적어주었다. ViewResolver를 사용하게 되면 간단하게 view 이름만 반환해서 원하는 view 페이지를 보여줄 수 있다.
ViewResolver는 사용자가 요청한 것에 대한 응답 view를 렌더링 하는 역할인데, view 이름에 해당하는 객체를 맵핑한다. 원래 DispatcherServlet가 가지고 있는 것들은 따로 등록하지 않아도 사용자 요청이 처리가 되는데, ViewResolver도 동일하다. DispatcherServlet가 가지고 있는 InternalResourceViewResolver를 사용할 수 있다.
이름만 어렵지, 그냥 정리하자면 view로 연결할 때 해당 객체 이름만 써서 연결하기 위해 하는 설정이다.
prefix와 suffix에 저장된 값이 앞뒤로 붙는 것.
2) kosmo-1.xml 수정하자!
kosmo-1.xml로 가서 컨트롤러와 연결해주자.
컨트롤러 패키지 경로와 같다. 이게 베이스 패키지라는 것.
여기도 Jasonview를 할껀데, class에서 mapping 까지 치고 ctrl + space 하면 나온다.
jsonview 클릭매핑은 resources로 하자.
3) views 안에 연결할 파일 만들기
views 연결하자.
views 안에 hello.jsp 만들기.
views 안에 있는 것이 실질적으로 웹상에 띄워지는 것으로, 아까 처음에 만든 index.jsp와 연결할 것이다.
2. 컨트롤러 생성
src에클래스를만들자.
패키지 : kr.co.ikosmo.mvc.controller
이름 : HelloController
kosmo라고 했어야했어서 이름 수정해주었다.
3. Controller에서 실행할 index와 views를 연결하자.
1) HelloController.java 가서 views와 연결
requestmapping하고 링크 연결하기
컨트롤러에서 우리는 처음 만들었던 hello 모델을 views의 hello와 연결해주었다.
2) index.jsp 가서 링크 만들기
첫 페이지에서 Hello 라는 글자를 누르면 views의 hello로 가게 하자.
링크 연결
3) hello.jsp 가서 링크 만들기
첫 페이지에서 Hello.jsp 에 표시하기.
index.jsp를 실행하면?
실행 안됨ㅠㅠㅠ
이유 ) WEB-INF 폴더 안에 sping 폴더 생성 후 거기에 root-context.xml 만들었어야함.