잡동사니에도 사랑을

스프링 설치 및 정리 본문

정리/Spring정리

스프링 설치 및 정리

luvforjunk 2021. 11. 4. 16:16
728x90
반응형

Spring Framework

 

JAVA ENTERPRISE APPLICATION 개발에 사용되는 자바플랫폼을 위한 오픈소스 어플리케이션 프레임워크이다

 

특징

- 자바 객체를 담고 있는 경량 컨테이너이다

  객체의 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로 부터 필요한 객체를 얻어올 수 있다

- POJO(Plain Old Java Object) 기반의 개발

- 제어 반전(IoC - Inversion of Control)을 지원

  컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자 코드를 호출할 수 있다

- 의존성 주입 DI(Dependency Injection)을 지원

  설정파일을 통해서 객체간의 의존 관계를 설정할 수 있다

- AOP(Aspect Oriented Programming) 지원

- 트랜잭션 처리를 위한 방법을 제공

- 영속성과 관련되 다양한 서비스를 제공

  myBatis, hibernate등 데이터 베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다

- 동적인 웹 사이트 개발하기 위한 여러가지 서비스를 제공

  우리나라에서는 공공기관의 웹 서비스 개발시 사용을 권장하는 전자정부 표준프레임워크의 기반 기술로 사용되고 있다

- MVC Framework를 제공

 

★ 스프링 설치

https://spring.io

 

https://repo.spring.io/ui/native/release/org/springframework/spring/

 

http://dist.springsource.com/release/STS/index.html

https://spring.io/tools

https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3

 

http://commons.apache.org/logging/download_logging.cgi

 

http://commons.apache.org/logging/download_logging.cgi

 

commons.apache.org

 

 

기존에는 공식사이트에서 zip 압축파일을 받아 jar를 구했는데 지금 사이트에서 Maven, Gradle로 라이브러리를 받게 끔 하고 있다

 

1. spring-framework-5.2.0.RELEASE-dist.zip 다운로드

2. 압축풀기

 

★ 스프링 편집기

1. STS(Spring Tool Suite) 다운받아서 설치

 

2. Eclipse에서 Help → Eclipse Marketplace → STS 검색

 

첫번째

현재 JDK 8.0 으로 설치되어 있으면 sts.exe 실행 시 아래와 같은 error가 뜬다

 

[JVM 버전 1.8.0_281은이 제품에 적합하지 않습니다. 버전 : 11 이상이 필요합니다.]

라는 error가 뜬다. 아래의 내용처럼 수정한다.

-Dosgi.requiredJavaVersion=11 ===> -Dosgi.requiredJavaVersion=1.8

 

두번째

고쳐는데도 이클립스 실행이 안된다.

이것은 IDE를 실행시켜주는 가상머신이 없어서 나온 것이다. 이클립스는 자바로 만들어져 있기 때문에 이클립스를 돌리는 가상머신이 없으면 이클립스를 실행시킬 수 없다.

 

아래의 코드를 eclipse.ini에 추가해야 한다.

-vm 

C:\Program Files\Java\jdk-11.0.13\bin\javaw.exe

 

sts.ini

-startup

plugins/org.eclipse.equinox.launcher_1.6.300.v20210813-1054.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.300.v20210828-0802

-product

org.springsource.sts.ide

--launcher.defaultAction

openFile

-vm 

C:\Program Files\Java\jdk-11.0.13\bin\javaw.exe

-vmargs

-Dosgi.requiredJavaVersion=11

-Dosgi.dataAreaRequiresExplicitInit=true

-Xms256m

-Xmx2048m

--add-modules=ALL-SYSTEM

-Dosgi.module.lock.timeout=10

 

- 인터페이스 베이스 설계와 스프링을 활용함으로써 소스 파일은 변경하지 않고 스프링 설정 파일만 변경해서 다양한 객체를 생성하는, 변경이 유연한 어플리케이션을 작성할 수 있게 되었다

 

- 스프링을 사용하는 이유는 "필요한 인스턴스를 스프링에서 미리 생성해 준다" 라는 장점을 얻을 수 있다.

 

- 스프링은 자주 변경이 되거나 컴포넌트의 재활용이 높은 유연한 어플리케이션을 작성할 수 있게 하며 테스트도 쉽다.

 

- 스프링은 프레임워크지만 스트럿츠처럼 웹 어플리케이션 전용의 프레임워크와는 다른 특징이 있다

 

- 스프링은 '어플리케이션 프레임워크'로 불린다

  콘솔 어플리케이션나 스윙과 같은 GUI 어플리케이션등 어떤 어플리케이션에도 적용 가능한 프레임워크이다.

 

- 스프링은 EJB와 같이 복잡한 순서를 거치지 않아도 간단하게 이용할 수 있기 때문에 "경량 컨테이너" 라고 부른다.

 

- 스프링은 Dependency Injection(DI)와 Aspect Oriented Programming(AOP)을 가장 중점적인 기술로 사용하지만 여러가지 기능도 제공하고 있다.

 

- 스프링은 크게 나눠 7개 모듈로 구성되어 있으며, 필요에 따라 이들을 서로 조합하여 사용할 수 있다

- Spring Core

- Spring AOP

- Spring ORM

- Spring DAO

- Spring Web

- Spring Context

- Spring Web MVC

 

 

 

[실습]

Project : chapter01 (Spring Legacy Project – Simple Java)

 

Project : chapter01_SpringMaven (Spring Legacy Project – Simple Java)

우클릭 - Configure - Convert to Maven Project

 

* 필요한 JAR

commons-logging-1.2.jar

spring-aop-5.3.5.RELEASE.jar

spring-beans-5.3.5.RELEASE.jar

spring-context-5.3.5.RELEASE.jar

spring-core-5.3.5.RELEASE.jar

spring-expression-5.3.5.RELEASE.jar

 

https://mvnrepository.com/

 

 

 

 

 

 

★ DI (Dependency Injection)

 

스프링의 핵심 개념

 

객체사이의 의존 관계를 자기 자신이 아닌 외부에 의해서 설정된다는 개념이다

스프링에서는 설정파일을 사용하여 손쉽게 객체간의 의존관계를 설정하기에 스프링을 DI컨테이너라고 부르기도 한다.

DI 컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역활을 한다.

DI 컨테이너가 인스턴스를 생성하도록 하려면 프로그램 소스 내부에서 new 로 직접 생성하지 않고 설정파일에서 필요로 하는 클래스의 정보를 설정해 주어야한다.

 

스프링은 각 클래스간의 의존관계를 관리하기 위한 방법

- Constructor Injection

- Setter Injection

 

가. Constructor Injection

: 생성자를 통해서 의존 관계를 연결시키는 것을 말한다.

: 생성자를 통해서 의존 관계를 연결하기 위해서는 XML 설정 파일에서 <bean>요소의 하위요소로 <constructor-arg>를 추가해야 한다.

 

1. 객체를 전달할 경우에는 ref 요소를 사용

public class Foo {

private Bar bar;

 

public Foo(Bar bar){

this.bar = bar;

}

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg>

<ref bean="bar" />

</constructor-arg>

</bean>

<bean id="bar" class="Bar" />

 

 

 

2. 전달인자가 2개 이상인 경우

기본데이터 타입일 경우에는 value 요소를 사용하여 의존관계를 연결시키기 위한 값을 지정

public class Foo {

public Foo(int a, String b) { }

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg>

<value>25</value>

</constructor-arg>

<constructor-arg value="Hello" />

</bean>

-----------------------------------

<bean id="foo" class="Foo">

<constructor-arg index="1" value="Hello" />

<constructor-arg index="0">

<value>25</value>

</constructor-arg>

</bean>

 

3. type 속성을 이용하여 지정

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg type="int" value="25" />

<constructor-arg type="java.lang.String" value="Hello" />

</bean>

 

나. Setter Injection

: setter메소드를 이용하여 의존 관계를 연결시키는 것을 말한다.

: <property>요소의 name 속성을 이용하여 값의 의존 관계를 연결시킬 대상이 되는 필드값을 지정한다

 

public class Foo {

private Bar bar;

 

public void setBar(Bar bar){

this.bar = bar;

}

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<property name="bar" ref="bar"></property>

</bean>

 

<bean id="bar" class="Bar" />

 

 

 

 

 

★ 스프링 AOP(Aspect Oriented Programming) - 관점지향프로그램

             OOP(Object Oriented Programming) - 객체지향프로그램

 

Aspect

어플리케이션의 핵심 기능은 아니지만, 어플리케이션을 구성하는 중요한 요소이고, 부가적인 기능을 담당하는 요소

 

Aspect = Advice + Pointcut

어드바이저는 아주 단순한 형태의 애스펙트라고 볼 수 있다

 

AOP

어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 모듈로 만들어서 설계하고 개발하는 방법을 AOP(Aspect Oriented Programming)이라고 한다

 

AOP는 새로운 프로그래밍 패러다임이 아니라, OOP를 돕는 보조적인 기술이다

 

어플리케이션의 핵심기능을 따라 코딩하지 않고, 핵심기능 대신, 부가적인 기능을 바라보고 집중해서 설계하고 개발할 수 있다

어플리케이션을 부가기능 관점에서, 새롭게 바라볼 수 있게 해준다 라는 의미로 AOP를 관점 지향 프로그래밍이라고도 한다

 

스프링이 제공하는 AOP는 프록시를 이용한다

프록시를 통해 타겟 오브젝트의 메소드가 호출될 경우, 프록시가 제어를 가로채고, InvocationHandler와 같은 오브젝트를 통해 타겟 메소드의 실행 전 후로 부가적인 기능을 실행한다

 

AOP 기술의 원조인 AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술이다

타깃 오브젝트를 뜯어고쳐서 부가기능을 직접 넣어주는 방식을 사용한다

소스코드를 고치는 것이 아니라, 컴파일 된 타깃 클래스의 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점을 가로채서 바이트코드를 조작 한다

 

프록시를 사용하지 않고 클래스 파일 조작과 같은 복잡한 방법을 사용하는 이유는

1. 스프링과 같은 DI 컨테이너의 도움이 필요 없다

스프링과 같은 컨테이너가 사용되지 않는 환경에서 AOP 적용이 가능하다

 

2. 프록시보다 훨씬 강력하고 유연하다

프록시 방식은 타깃 오브젝트가 생성되고 난 후부터 적용이 가능하다

하지만 AspectJ는 어떤 순간에든지 적용이 가능하다

클래스 바이트코드를 직접 조작하는 것이기 때문에 거의 제한이 없다

대부분의 부가기능은 프록시 방식을 사용해 메소드의 호출 시점에 부여하는 것으로도 충분하다

AspectJ와 같은 고급 AOP 기술은 바이트코드 조작을 위해 JVM의 실행옵션을 변경하고, 별도의 바이트코드 컴파일러를 사용하고, 특별한 클래스 로더를 사용하는 등 번거로운 작업이 필요하다

 

: 일반적으로 스프링의 AOP를 사용하고, 스프링의 AOP 수준을 넘어서는 기능이 필요하다면

AspectJ를 사용하는 것이다

 

: 핵심관심사항과 공통관심사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용

 

: 공통관심사항을 구현한 코드를 핵심 로직을 구현한 코드에 삽입하는 것

 

: 핵심로직을 구현할 때 트랜잭션 적용이나 보안 검사와 공통 기능을 삽입할 필요가 없다

 

 

 

※ AOP 용어

 

1. Target : 부가기능을 부여할 대상, 핵심기능이 담긴 클래스

 

2. Advice : 부가기능을 담은 모듈

               언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의

               Before, After Returning, After Throwing, Around 등이 있다.

 

3. Joinpoint : Advice를 적용 가능한 지점을 의미

                  메소드 호출, 필드 값 변경 등

                  스프링의 프록시 AOP에서 조인 포인트는 메소드의 실행 단계뿐이다.

                  타깃 오브젝트가 구현한 인터페이스의 모든 메소드가 조인 포인트가 된다.

 

4. Pointcut : 조인 포인트를 선별하는 기능을 정의한 모듈

                 가능한 조인 포인트들 중에 실제로 부가기능을 적용할 것들을 선별한다.

                 클래스를 선정하고, 그 안의 메소드를 선정하는 과정을 거친다.

                 실제로 Advice가 적용되는 Joinpoint를 나타낸다.

 

5. Proxy : 클라이언트와 타깃 사이에 존재하면서 부가기능을 제공하는 오브젝트

             클라이언트는 타깃을 요청하지만, 클라이언트에게는 DI를 통해 타깃 대신 프록시가 주입된다.

             클라이언트의 메소드 호출을 대신 받아서 타깃에게 위임하며, 그 과정에서 부가기능을 부여한다.

             스프링 AOP는 프록시를 이용한다.

 

6. Advisor : 어드바이스와 포인트컷을 하나로 묶어 취급한 것

                AOP의 가장 기본이 되는 모듈이다.

                스프링은 자동 프록시 생성기가 어드바이저 단위로 검색해서 AOP를 적용한다.

 

7. Aspect : 다수의 포인트컷과 어드바이스의 조합으로 만들어진다.

               보통 싱글톤 형태의 오브젝트로 존재한다.

               어드바이저는 아주 단순한 애스펙트라고 볼 수 있다.

 

8. Weaving : Advice를 핵심로직코드에 적용하는 것을 Weaving라고 한다.

 

: Advice를 Weaving하는 3가지 방식

- 컴파일 시에 Weaving

  AspectJ에서 사용하는 방식

  AOP가 적용된 클래스 파일이 생성된다.

 

- 클래스 로딩 시에 Weaving

  AspectJ 5/6 버전이 컴파일 방식과 클래스 로딩방식을 함께 지원

 

- 런타임 시에 Weaving

  소스코드나 클래스 정보 자체를 변경하지 않는다.

  프록시를 이용한다(핵심로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심로직을 구현한 객체에 접근한다.)

  프록시는 메소드가 호출될 때에만 적용할 수 있다(필드값 변경에 대해서는 적용 불가능)

 

: 스프링은 자체적으로 프록시 기반의 AOP를 지원한다.

  메소드 호출 Joinpoint만 지원(필드값 변경과 같은 Joinpoint는 불가능)

 

: 스프링 AOP는 자바 기반이다.

  AspectJ는 Aspect를 위한 별도의 문법이 필요하다

 

: 대상 객체의 메소드를 실행하기 전/후에 원하는 기능을 삽입(Around Advice)하는데 캐시기능, 성능 모니터링 기능과 같은 Aspect를 구현

 

 

[실습]

Project : chapter03

         chapter03_SpringMaven

 

필요한 JAR

aspectjweaver-1.9.6.jar

commons-logging-1.2.jar

 

spring-aop-5.2.0.RELEASE.jar

spring-beans-5.2.0.RELEASE.jar

spring-context-5.2.0.RELEASE.jar

spring-core-5.2.0.RELEASE.jar

spring-expression-5.2.0.RELEASE.jar

 

 

 

 

Package : sample02_Java

Interface : MessageBean.java

Class : MessageBeanImpl.java

           HelloSpring.java - main()

 

Package : sample03_Advice

Interface : MessageBean.java

Class : MessageBeanImpl.java

            LoggingAfterAdvice.java

            LoggingAroundAdvice.java

            LoggingBeforeAdvice.java

            HelloSpring.java - main()

src : applicationContext03.xml

 

Package : sample04_Advisor

Interface : MessageBean.java

Class : MessageBeanImpl.java

           LoggingAfterAdvice.java

           LoggingBeforeAdvice.java

           HelloSpring.java - main()

src : applicationContext04.xml

 

Package : sample05_RegExp

Interface : MessageBean.java

Class : MessageBeanImpl.java

            LoggingAfterAdvice.java

            LoggingBeforeAdvice.java

            HelloSpring.java - main()

src : applicationContext05.xml

 

 

Project : chapter03_SpringMaven

Package : sample01

Interface : MessageBean.java

Class : HelloSpring.java

      MessageBeanImpl.java

      LoggingAdvice.java - 공통관심사항

src : acQuickStart.xml

 

 

★ 스프링과 JDBC

스프링은 JDBC를 비롯하여 ORM프레임워크(myBatis, hibernate, JPA(Java Persistence API))를 지원한다

스프링의 목표는 인터페이스에 의한 개발인데 DAO는 데이터베이스에서 데이터를 읽거나 쓰는 수단을 제공하기 위해 존재하며, 반드시 인터페이스를 통해 외부에 제공돼야 한다.

서비스 객체는 인터페이스를 통해서 DAO에 접근한다

서비스 객체를 특정 데이터 액세스 구현체에 결합시키지 않음으로써 테스트를 용이하게 한다

DAO인터페이스는 DAO구현과 서비스 객체 사이에서 느슨한 결합이 유지될 수 있게 한다

 

서비스 객체 → DAO 인터페이스

UserInsertService UserDAO

                           ↑

                      DAO 구현 객체

                        UserDAOImpl

 

스프링은 데이터베이스 연동을 위한 템플릿 클래스를 제공함으로써

Connection, Statement(PreparedStatement), ResultSet등을 생성하고 처리한 다음 close(반환)하는 JDBC의 중복된 코드를 줄일 수 있다

 

JDBC는 무조건 SQLException의 예외만 발생하므로 정확히 Connection에서 발생했는지 아니면 Statement에서 발생했는지 따져봐야한다. JdbcTemplate클래스는 SQLException이 발생하면 스프링이 제공하는 예외 클래스중 알맞는 것으로 변환해서 발생한다.

스프링은 JDBC보다 다양한 예외 계층을 제공하고 어떤 퍼시스턴스 솔루션과도 연관성을 갖지 않는다

스프링을 사용하면 퍼시스턴스 기술과 관계없이 일관성있게 예외를 발생시킬 수 있다

 

스프링의 DataAccessException는 비검사형 예외(try~catch블럭을 사용하지 않아도 컴파일이 되는 예외)로서 반드시 잡아서 처리할 필요가 없다

 

스프링이 제공하는 DataSource를 설정하는 3가지 방법

1. 커넥션풀을 이용한 DataSource 설정

스프링이 직접적으로 커넥션풀을 제공하진 않지만 DBCP(Jakarta Commons Database Connection Pool) API와 같은 커넥션 풀 라이브러리를 이용

DBCP에는 풀링 기능을 제공하는 다양한 데이터 소스가 포함되 있지만 BasicDataSource가 가장 많이 사용된다

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />

     <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />

     <property name="username" value="" />

     <property name="password" value="" />

     <property name="initialSize" value="5" />

→ 해당 풀이 시작될 때 생성할 커넥션 수, 0은 무제한

     <property name="maxActive" value="10" />

→ 해당 풀에서 동시에 제공할 수 있는 최대 커넥션 수, 0은 무제한

</bean>

 

2. JNDI을 이용한 DataSource 설정

WebLogic이나 JBoss와 같은 JEE 어플리케이션 서버를 사용할 경우

톰캣이나 Resin등의 웹 컨테이너를 사용할 경우

 

<jee:jndi-lookup id="dataSource" jndi-name="oracle" resource-ref="true" />

<jee:jndi-lookup>태그를 이용 - 스프링2.0부터 지원

jndi-name 프로퍼티는 JDNI에 있는 리소스의 이름을 지정한다

jndi-name프로퍼티만 지정된 경우에는 데이터소스는 지정된 jndi-name을 그대로 이용해서 검색한다

자바 애플리케이션 서버에서 가동되는 경우에는 resource-ref=true이면 jndi-name값의 앞에 "java:comp/env"가 붙은 이름을 사용한다

 

<jee:jndi-lookup>태그를 사용하지 않고 JndiObjectFactoryBean클래스를 이용할 수 있다

 

3. DriverManager을 이용한 DataSource 설정

: 스프링에 설정할 수 있는 가장 단순한 데이터 소스는 JDBC드라이버를 통해 정의된 것이다

 

- DriverManagerDataSource

애플리케이션이 커넥션을 요청할 때마다 새로운 커넥션을 반환한다

DBCP의 BasicDataSource와는 달리 커넥션은 풀링되지 않는다

멀티스레드에서도 동작은 하지만 커넥션이 필요할 때마다 새로 커넥션을 생성하므로 심각한 성능 저하를 유발한다.

 

- SingleConnectionDataSource

커넥션을 요청하면 항상 동일한 커넥션을 반환한다

커넥션 풀링 기능은 없지만 오직 하나의 커넥션만을 풀링하는 데이터소스

사용할 수 있는 커넥션이 오직 하나뿐이라서 멀티스레드 애플리케이션에서는 제대로 동작하지 않을 것이다

: 스프링의 JDBC 프레임워크는 자원관리와 예외 처리를 대신 해주므로 JDBC코드가 훨씬 간결해진다

스프링은 단순 반복적인 데이터 액세스 코드를 템플릿 클래스 뒤로 추상화해 숨긴다

 

1. JdbcTemplate

스프링의 가장 기본적인 JDBC 템플릿

색인된 파라미터(indexed parameter)기반의 쿼리를 통해 데이터베이스를 쉽게 액세스하는 기능을 제공

 

2. NamedParameterJdbcTemplate

SQL과 값들을 색인된 파라미터 대신 명명된 파라미터(named parameter)로 바인딩하여 쿼리를 수행할 수 있게 해준다

 

* 스프링이 제공하는 기반클래스

JdbcTemplate - JdbcDaoSupport (JdbcTemplate 빈으로 생성할 필요가 없다 - 메소드 호출)

NamedParameterJdbcTemplate - NamedParameterJdbcDaoSupport

 

JdbcDaoSupport 에서는 getJdbcTemplate() 메소드를 제공하므로 JdbcTemplate을 편리하게 사용할 수 있다

 

[실습]

Project : chapter04

         chapter04_SpringMaven

 

* JAR 3개 추가

spring-jdbc-5.2.3.RELEASE.jar

spring-tx-5.2.3.RELEASE.jar

 

commons-collections-4.1.jar / commons-collections4-4.4.jar

commons-dbcp-1.4.jar / commons-dbcp2-2.8.0.jar

commons-pool-1.6.jar / commons-pool2-2.9.0.jar

 

ojdbc8.jar

 

Project : chapter04

Package : user.main

Class : HelloSpring.java - main 메소드

 

Package : user.service

Interface : UserService.java

           public void execute(); - 추상메소드

Class : UserInsertService.java

           UserSelectService.java

           UserUpdateService.java

           UserDeleteService.java

 

Package : user.dao

Interface : UserDAO.java

Class : UserDAOImpl.java

 

Package : user.bean

Class : UserDTO.java

 

Package : spring

File : applicationContext.xml

           db.properties

 

 

★ 스프링과 myBatis

ORM(Object Relational Mapping) 프레임워크는 데이터베이스와 객체와의 관계를 맵핑시켜 퍼시스턴스 로직 처리를 도와주는 프레임워크이다.

대표적으로 iBatis와 hibernate, JPA가 있다

 

myBatis는 SQL쿼리문, 예외처리, 트랙잭션 관리들을 XML형식으로 관리한다

POJO(Plain Old Java Object)객체와 테이블의 컬럼들을 편리하고 빠르고 정확하게 매칭할 수 있다.

 

myBatis의 목표와 특징은 쉽고, 간단하고, 의존성이 적다는 것이다

SQL문과 자바코드를 분리함으로 인해 자바 개발자는 쿼리문을 신경 쓰지 않아도 된다.

 

myBatis는 자바오브젝트와 SQL문 사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다

자바코드와 SQL를 분리하므로서 SQL문의 변경이 있을 때 마다 자바를 수정하지 않아도 되고 컴파일을 하지 않아도 된다

 

[실습]

Project : chapter05

          chapter05_SpringMaven

 

* JAR 2개 추가

mybatis-3.5.6.jar

mybatis-spring-1.3.3.jar

 

commons-collections-4.1.jar / commons-collections4-4.4.jar

commons-dbcp-1.4.jar / commons-dbcp2-2.8.0.jar

commons-pool-1.6.jar / ccommons-pool2-2.9.0.jar

ojdbc8.jar

 

Packagge : user.dao

Interface : UserDAO.java

Class : UserDAOMybatis.java

            userMapper.xml

 

Package : spring

File : applicationContext.xml

           mybatis-config.xml

           db.properties

 

 


 

 

★ 스프링 MVC

 

스프링 MVC도 컨트롤러를 사용하여 클라이언트의 요청을 처리한다

스프링에서 DispatcherServlet 이 MVC에서 C(Control) 부분을 처리한다.

개발자가 처리할 부분은 클라이언트의 요청을 처리할 컨트롤러와 응답화면을 전송할 JSP나 Velocity 템플릿 등 뷰 코드이다

DispatcherServlet, HandlerMapping, ViewResolver등은 스프링이 기본적으로 제공하는 구현 클래스를 사용한다.

 

스프링 MVC의 구성 요소

1. DispatcherServlet

클라이언트의 요청을 전달 받는다

컨트롤러에게 클라이언트의 요청을 전달하고 Controller가 리턴한 결과값을 View에 전달하여 응답을 생성하도록 한다.

 

2. HandlerMapping(내장되어 있음)

클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정한다

 

3. Controller(Java 역할을 한다)

클라이언트의 요청을 처리한 뒤 결과를 DispatcherServlet에 알려준다

 

4. ModelAndView

컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.

 

5. ViewResolver

컨트롤러의 처리 결과를 생성할 뷰를 결정한다.

 

6. View

컨트롤러의 처리 결과 화면을 생성한다.

JSP나 Velocity 템플릿 파일등을 뷰로 사용한다.

 

[실습]

Project : chapter06 (Dynamic Web Project) - *.jar

project명에서 우클릭 - Spring - Add Spring Project Nature

 

Project : chapter06_SpringWebMaven (Dynamic Web Project) - pom.xml

project명에서 우클릭 - Spring - Add Spring Project Nature

project명에서 우클릭 - Configure - Convert to Maven Project

project명에서 우클릭 - Maven - Update Project...

 

Project : chapter06_SpringMVC (Spring MVC Project)

① Spring MVC Project requires a download of 16608 bytes - Yes

② 3단계로 package를 작성해야한다

Package를 3단계로 설정할 때 마지막을 Project명(chapter06_SpringMVC)과 똑같이 잡아야 URL의 경로를 /chapter06_SpringMVC로 인식한다

만약 Project명이 chapter06_SpringMVC이고 Package명은 com.example.spring으로 설정하면 URL 경로가 /spring로 잡힌다

 

http://localhost:8080/chapter06_SpringMVC/main/index.do - error

http://localhost:8080 /main/index.do 하면 결과가 나온다

그러면 경로를 바꾸어야 하는데

Tomcat에서 더블클릭 - Modules(탭) - Path : /spring를 /chapter06_SpringMVC로 변경하면 된다

 

Please specify the top-level package e.g. com.mycompany.myapp* :

                                                              com.example.chapter06_SpringMVC

 

➂ JDK와 Spring 버전을 변경한다

   - JDK는 기본이 1.6 으로 생성된다.

   - 스프링은 기본이 3.1.1 으로 생성된다

 

 

[실행]

http://localhost:8080/chapter06/hello.do

 

Project : chapter06

Package : com.controller

Class : HelloController.java

 

Folder : WEB-INF

          web.xml

          dispatcher-servlet.xml

 

Folder : view

          hello.jsp

 

 

* web.xml

1. web.xml에 DispathcerServlet 설정을 통해 스프링 설정 파일을 지정합니다.

2. *.do로 들어오는 클라이언트의 요청을 DispatcherServlet이 처리하도록 했다

3. DispatcherServlet은 /WEB-INF/서블릿이름-servlet.xml 파일로부터 스프링 설정 정보를 읽어온다.

 

* HelloController.java

1. 컨트롤러를 구현하려면 @Controller 어노테이션을 클래스에 적용한다.

2. @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메소드를 지정한다.

3. ModelAndView.setViewName()메소드를 이용해서 컨트롤러의 처리 결과를 보여줄 뷰 이름을 지정한다.

 

* dispatcher-servlet.xml

1. DispatcherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정파일에 컨트롤러를 빈으로 등록해주어야 한다

2. DispatcherServlet은 뷰이름과 매칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.

3. 스프링 MVC는 JSP, Velocity, FreeMarker등의 뷰 구현 기술과의 연동을 지원하는데, JSP를 뷰 기술로 사용할 경우 InternalResourceViewResolver 구현체를 빈으로 등록해주면 된다.

4. ViewResolver가 /view/뷰이름.jsp를 뷰JSP로 사용한다는 의미이다

 

[문제]

Project : chapter06_1

Package : com.controller

Class : SumController.java

 

Package : com.bean

Class : SumDTO.java

 

Foler : sum

File : input.jsp

         result.jsp

 

스프링 설정 파일

/WEB-INF/dispatcher-servlet.xml → /WEB-INF/spring/appServlet/mvc-context.xml

 

[실행결과]

http://localhost:8080/chapter06_1/input.do

 

input.jsp result.jsp

 X : ㅁ 25 + 36 = xx

 Y : ㅁ

 

http://localhost:8080/chapter06_1/result.do

 

 

Project : chapter06_1

Package : com.controller

Class : SungJukController.java

 

Package : com.bean

Class : SungJukDTO.java

Field : name, kor, eng, math, tot, avg

 

Foler : sungJuk

File : input.jsp

         result.jsp

 

스프링 설정 파일

/WEB-INF/spring/appServlet/servlet-context.xml

 

[실행결과]

                               namespace

http://localhost:8080/chapter06_1/sungJuk/input.do

               

 input.jsp result.jsp

 이름 : ㅁ *** xxx 성적 ***

 국어 : ㅁ 총점 : xxx

 영어 : ㅁ 평균 : xx.xxx

 수학 : ㅁ

 

                               namespace

http://localhost:8080/chapter06_1/sungJuk/result.do

 

 

★ WAC (Web Application Context) 등록

 

1. ContextLoaderListener가 생성하는 Root WAC

- 웹 환경과 독립적인 빈 등록

- 디폴트 설정 파일 /WEB-INF/applicationContext.xml 으로 설정 된다

- 서비스계층과 데이터 액세스 계층을 포함해서 웹 환경과 직접 관련이 없는 모든 빈들을 여기에 등록 한다

 

 → 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우

      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

 

2. DispatcherServlet이 생성하는 WAC

- DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록

- 디폴트 설정 파일 /WEB-INF/서블릿이름-servlet.xml으로 설정된다

  

  → 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우

      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

 

 

[문제] Spring MVC + mybatis + jQuery

 

http://localhost:8080/chapter06_SpringWebMaven/main/index

 

Project : chapter06_SpringWebMaven (

 

Package : main.controller

Class : IndexController.java

 

Package : user.controller

Class : UserController.java

 

Package : user.bean

class : UserDTO.java

 

Package : user.service

Interface : UserService.java

Class : UserServiceImpl.java

 

Package : user.dao

Interface : UserDAO.java

Class : UserDAOMybatis.java

         : userMapper.xml

 

File : index.jsp

 

Folder : user

File : writeForm.jsp

          write.jsp

 

Folder : js

File : user.js

 

src : mybatis-config.xml

 

스프링 설정 파일

/WEB-INF/dispatcherServlet-servlet.xml → /WEB-INF/spring/appServlet/servlet-context.xml

 

/WEB-INF/spring/root-context.xml

 

 

 

 

 

 

CSV (Comma Separated Value)

  - 쉼표를 기준으로 항목을 구분하여 저장한 데이터를 말한다.

  - 데이터베이스나 표 계산 소프트웨어 데이터를 보존하기 위해 이런 형식을 사용 한다.

  - 각 항목이나 판매 내용마다 쉼표(comma)로 구분하여 기록한다.

  - CSV 형식의 파일은 텍스트 파일로 보존하여 문서 처리기나 편집기에서 열람 편집할 수 있다.

  - 수많은 애플리케이션에서 취급하는 범용 형식이기 때문에 PDA(personal digital assistant)와

    PC 사이에 주소록이나 표의 데이터를 주고 받을때에도 데이터 파일을 CSV 형식으로 변환해서

    송수신하는 경우가 많다.

 

XML (eXtensible Markup Language)

  - 인터넷 웹페이지를 만드는 HTML을 획기적으로 개선하여 만든 언어이다.

  - 홈페이지 구축기능, 검색기능 등이 향상되었고, 웹 페이지의 추가와 작성이 편리 해졌다.

  - HTML보다 홈페이지 구축 기능, 검색 기능 등이 향상되었고 클라이언트 시스템의 복잡한

    데이터 처리를 쉽게 한다. 또한 인터넷 사용자가 웹에 추가할 내용을 작성, 관리하기에 쉽게

    되어 있다.

  - HTML은 웹 페이지에서 데이터베이스처럼 구조화된 데이터를 지원할 수 없지만,

    XML은 사용자가 구조화된 데이터베이스를 뜻대로 조작할 수 있다.

 

JSON (JavaScript Object Notation)

  - 자바스크립트 표준 객체 표기법

  - 자바스크립트 객체를 문자로 표현 가능

  - 순수 문자열만을 사용함으로 오버헤드를 최대한 줄일 수 있다.

  - 객체 방식이므로 파싱 할 필요 없이 손쉽게 접근 가능

  - 인터넷에서 자료를 주고받을 때 그 자료를 표현하는 방법이다.

  - 그 형식은 자바스크립트의 구문 형식을 따르지만, 프로그래밍 언어나 플랫폼에 독립적이다.

  - 입체적인 데이트를 표현하기 위한 경량화된 표현 기법

  - 현재는 거의 모든 언어에서 표준처럼 사용하고 있다.

  - 표현 방법

    { "이름" : "값", "이름" : "값" }

 

ex) 01.json

{

"message": "Hello JSON Object",

"age" : 20

}

 

 

* JSON을 쓰는 이유

- Java Beans와 일치시켜서 데이터를 처리할 수 있기 때문이다.

 

 

* XML과 JSON의 비교

20150001, 홍길동, 010-1234-5678

20150002, 고길동, 010-2345-6789

 

 

XML <?xml version="1.0" encoding="utf-8"?>
<students>
    <student st_id="20150001">
        <name>홍길동</name>
        <tel>010-1234-5678</tel>
    </student>
    <student st_id="20150002">
        <name>고길동</name>
        <tel>010-2345-6789</tel>
    </student>
</students>
JSON {
    "students" : [
        {"st_id" : "20150001", "name" : "홍길동", "tel" : "010-1234-5678" },
        {"st_id" : "20150002", "name" : "고길동", "tel" : "010-2345-6789" }
    ]
}

 

 

* JSON 파일의 구조

- 기본구조

{

"이름" : 데이터,

"이름" : 데이터

}

 

 

- 구조 예시

{// Object

    "aa" : 5,// int

    "bb" : 7.7,// double

    "cc" : "AAA", // String

    "dd" : {// Object

"dd1" : "BBB", // String

"dd2" : "CCC"// String

    },

    "ee" : [// Array

{ "ee1" : "DDD1", "ee2" : "EEE1"},// Object

{ "ee1" : "DDD2", "ee2" : "EEE2"}// Object

    ]

}

 

JSONObject는 JSON형태의 데이터를 관리

주의점은 맵의 특성으로 인해 순서를 보장하지 않는다는 것이다. 즉 똑같이 뽑아내도 내용물의 순서가 섞일 수 있다.

스프링은 MessageConverter를 가지고 있다. 기본값은 JSON이다.

요청 시 데이터를 JSON으로 바꾸는데 JSON으로 바꿔주는 역할을 MessageConverter가 해준다

MessageConverter는 기본적으로 Jackson(JSON 데이터로 변경해주는 라이브러리)를 이용한다

 

MessageConverter

우리가 HTTP 요청을 모델에 바인딩하고 클라이언트에 보낼 HTTP 응답을 만들기 위해 뷰를 사용했던 방식과는 달리, HTTP 요청 본문과 HTTP 응답 본문을 통째로 메세지로 다루는 방식이다.

HTTP 프로토콜에서 메시지는 문자열을 통해 전송된다.

MessageConvert는 HTTP 통신에서 일반 문자열이 아닌 XML이나 JSON으로 통신하기 위해 사용된다.

주로 XML이나 JSON을 이용한 AJAX 기능이나 웹 서비스를 개발할 때 사용된다.

스프링의 @RequestBody와 @ResponseBody를 통해 구현할 수 있다.

애노테이션을 명시해두게 되면 스프링은 메세지 컨버터라는 것을 사용하여 HTTP 요청이나 응답을 메세지로 변환하게 된다.

즉 파라미터 부분에 @RequestBody를 입력할 경우, 파라미터 타입에 맞는 메세지 컨버터를 선택한 뒤 HTTP 요청 본문을 통째로 메세지로 변환하여 파라미터에 바인딩하는 것이다.

메서드의 상단에 @ResponseBody를 입력할 경우 또한 마찬가지로 리턴타입에 맞는 MessageConverter를 선택한 뒤 리턴 값을 통째로 메세지로 변환한 뒤 리턴해주는 것이다.

 

참고로 GET 방식의 요청일 경우 HTTP 요청 본문이 없으므로 @RequestBody를 사용할 수 없다.

@RequestParam이나 @ModelAttribute를 사용해야 한다.

 

DispatchServlet은 handlerMethod()를 호출하여 응답으로 String, ModelAndView, Object 중 하나를 반환한다.

 

String이 반환되면 뷰 이름을 찾아서 JSP를 렌더링 하고, 뷰가 없으면 404를 반환한다

그런데 메서드 위에 @ResponseBody 어노테이션이 있다면 뷰를 찾지 않고, String을 그대로 반환한다.

DispatcherServlet이 ModelAndView를 반환하면 ViewResolver가 실행된다.

그런데 @ResponseBody가 있으면 Object는 MessageConverter가 실행되어 반환된다.

 

BeanNameViewResolever

- BeanNameViewResolver는 Spring Container에 bean으로 등록된 View이름을 찾아

  사용하는 Resolver.

- ModelAndView를 반환할 때 ViewName을 셋팅하여 리턴하면 해당 beanName을 가진 View를 찾는다.

- 커스텀 View 클래스를 View로 사용하는 경우 주로 사용한다.

- 하나의 Dispatcher-Servlet은 다수의 ViewResolver를 사용할 수 있다.

  (order 옵션으로 먼저 사용할 Resolver 지정하여 사용)

  우선순위(order)는 0 부터 0,1,2...의 형태로 부여되며, 우선순위가 높은 ViewResolver가

  null을 리턴하면, 그 다음 우선순위를 가진 ViewResolver에게 View가 요청된다.

 

- 주의할 점은, InternalResourceViewResolver는 항상 우선순위 마지막에 놓도록 한다.

  InternalResourceViewResolver는 항상 View이름에 매핑되는 View 객체를 리턴하기 때문에

  (prefix, suffix 사용하여) null을 리턴하지 않는다.

  InternalResourceViewResolver가 우선순위가 높을 경우 그보다 낮은 우선순위의 ViewResolver들은

  사용되지 않게 된다.

 

InternalResourceViewResolver

- Resource를 대상으로 View를 찾는데, 정적 자원 즉, webapp 아래 자원들을 반환값으로 찾게 된다.

  컨트롤러가 지정한 View 이름으로부터 실제로 사용될 View를 선택한다.

- 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 붙인 값이 실제로 사용될

  자원의 경로가 된다.

 

 

★ 파일 업로드

1. 등록 폼에 파일 업로드 필드 추가

2. Controller의 업로드된 파일을 받도록 수정

3. 스프링에 멀티파트 파일 리졸버(multipart file resolver) 설정

4. 다중 파일 업로드시에는 <input type="file" name="">이 2개 이상 있을 때는 name속성에 같은 이름을 지정해야한다

 

* 폼에 파일 업로드 필드 추가

업로드된 파일은 대부분 바이너리 파일이다

파일이 첨부된 폼을 전송하는 경우 콘텐츠형식은 multipart/form-data를 해야한다

폼이 전송되면 이미지 파일의 바이너리 데이터를 포함하는 한 부분이 멀티파트 형식으로 전달된다

 

* 파일 업로드를 위한 스프링 설정

DispatcherServlet은 컨트롤러에 해당 데이터를 제공하기 위하여 POST 요청에서 멀티파트 데이터를 추출하는 멀티파트 리졸버가 필요하다

스프링이 CommonsMultipartResolver만 제공한다

 

<bean id="multipartResolver"

       class="org.springframework.web.multipart.commons.CommonsMultipartResolver"

       p:maxUploadSize="5000000" />

 

* 2개의 jar 파일 추가

commons-io-2.8.0.jar

commons-fileupload-1.4.jar

 

* pom.xml

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>2.8.0</version>

</dependency>

 

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.4</version>

</dependency>

[문제] Spring MVC + mybatis + jQuery

 

http://localhost:8080/spring/index.jsp

 

Project : SpringProject (Spring MVC Project)

SpringProject

     src/main/java

          com.mvc.spring (default) - http://localhost:8080/spring

          spring.config

              SpringConfiguration.java

 

     src/main/resources

          spring

               mybatis-config.xml

 

     src

          main

               webapp

                    WEB-INF

                         spring

                              appServlet

                                  servlet-context.xml - 웹과 관련된 설정 파일

                              root-context.xml - 웹과 독립된 설정 파일

 

 

 

D:\Spring\lib

 

repo.spring.io
 

JFrog

 

repo.spring.io

 

 

2.  5.3.5 버전을 선택한 뒤 spring-5.3.5-dist.zip 압축 파일을 선택해 만들어 두었던 D:\Spring\lib에 다운로드 받아준다.

 

 

3.  압축 풀기는 lib파일이 아닌 Spring 파일에서 진행한다.

 

 

 

Spring | Tools
 

Spring Tools 4 is the next generation of Spring tooling

Largely rebuilt from scratch, Spring Tools 4 provides world-class support for developing Spring-based enterprise applications, whether you prefer Eclipse, Visual Studio Code, or Theia IDE.

spring.io

 

 

1. Projects 카테고리의 

 

 

 

 

https://www.oracle.com/java/technologies/

 

 

 

728x90
반응형