1. Spring Framework란?



Java 엔터프라이즈 개발을 편하게 해주는 ①오픈소스 ②경량급 ③애플리케이션 프레임워크이다.


① 오픈소스 : Spring은 OpenSource의 장점을 충분히 취하면서 동시에 OpenSource제품의 단점과 한계를 잘 극복했다.


① 엔터프라이즈 개발 용이 : 개발자가 복잡하고 실수하기 쉬운 Low Level에 많이 신경 쓰지 않으면서 Business Logic

개발에 전념할 수 있도록 해준다.


② 경량급 프레임워크 : 단순한 웹컨테이너에서도 엔터프라이즈 개발의 고급기술을 대부분 사용할 수 있다.


③ 애플리케이션 프레임워크 : 특정 계층이나 기술, 업무 분야에 국한되지 않고 애플리케이션의

전 영역을 포괄하는 범용적인 프레임워크를 말한다.




2. Spring Framework 전략





엔터프라이즈 개발의 복잡함을 상대하는 Spring의 전략

-> ①Portable Service Abstraction, ②DI, ③AOP, ④POJO 가 있다.



① Portable Service Abstraction(서비스 추상화)


트랜젝션 추상화, OXM 추상화, 데이터 액세스의 Exception 변환기능 등 

기술적인 복잡함은 추상화를 통해 Low Level의 기술구현부분과 기술을 사용하는

인터페이스로 분리한다.



② 객체 지향과 DI(Dependency Injection)


Spring은 객체지향에 충실한 설계가 가능하도록 단순한 객체형태로 개발할 수 있고,

DI는 유연하게 확장 가능한 객체를 만들어 두고 그 관계는 외부에서 다이내믹하게 설정해준다.



③ AOP(Aspect Oriented Programming)


AOP는 애플리케이션 로직을 담당하는 코드에 남아있는 기술 관련 코드를 분리해서

별도의 모듈로 관리하게 해주는 강력한 기술이다.



④ POJO(Plain Old Java Object)


POJO는 객체지향 원리에 충실하면서, 특정 환경이나 규약에 종속되지 않고 필요에 따라 재활용될수 있는

방식으로 설계된 객체이다.




3. Spring Freamwork 특징



1. 컨테이너 역할

Spring 컨테이너는 Java 객체의 LifeCycle을 관리하며, Spring 컨테이너로부터 필요한 객체를 가져와

사용할 수 있다.


2. DI(Dependency Injection) 지원

Spring은 설정파일이나 어노테이션을 통해서 객체 간의 의존관계를 설정할 수 있도록 하고 있다.


3. AOP(Aspect Oriented Programming) 지원

Spring은 트랜젝션이나 로깅, 보안과 같이 공통적으로 필요로 하는 모듈들을 실제 핵심 모듈에서 분리해서

적용 할 수 있다.


4. POJO(Plain Old Java Object) 지원

Spring 컨테이너에 저장되는 Java객체는 특정한 인터페이스를 구현하거나, 특정클래스를 상속받지 않아도 된다.


5. 트랜젝션 처리를 위한 일관된 방법을 지원

JDBC, JTA 등 어떤 트랜젝션을 사용하던 설정을 통해 정보를 관리하므로 트랜젝션 구현에 상관없이 동일한 코드 사용가능


6. 영속성과 관련된 다양한 API 지원

Spring은 Mybatis, Hibernate 등 데이터베이스 처리를 위한 ORM(Object Relational Mapping)

프레임워크들과의 연동 지원



4. SpringFramework의 기능요소





Core 컨테이너


Core 컨테이너는 Spring프레임워크의 기본기능을 제공한다. 이 모듈에 있는 BeanFactory는 Spring의

기본 컨테이너이면서 스프링 DI의 기반이다.



Context


Context모듈은 BeanFactory의 개념을 확장한 것으로 국제화(I18N) 메시지, 애플리케이션 생명주기 이벤트, 

유효성 검증을 지원한다.



DAO


DAO 패키지는 JDBC에 대한 추상화 계층으로 JDBC 코딩이나 예외처리 하는 부분을 간편화 시켰으며, AOP 모듈을

이용해 트랜젝션 관리 서비스도 제공한다.



ORM


Mybatis, Hibernate, JPA 등 널리 사용되는 ORM 프레임워크과의 연결고리를 제공한다.

ORM 제품들을 Spring의 기능과 조합해서 사용할 수 있도록 해준다.



AOP


AOP 모듈을 통해 Aspect 지향 프로그래밍을 지원한다.

AOP 모듈은 스프링 애플리케이션에서 Aspect를 개발할 수 있는 기반을 지원한다.



Web


일반적인 웹 애플리케이션 개발에 필요한 기본기능을 제공하고, Webwork나 Struts와 같은

다른 웹어플리케이션 프레임워크와의 통합을 지원한다.



WebMVC


MVC(Model/View/Controller) 패러다임은 사용자 인터페이스가 애플리케이션 로직과

분리되는 웹 애플리케이션을 만드는 경우에 일반적으로 사용되는 패러다임이다. 이 패러다임을 바탕으로

웹 계층에서 결합도를 낮추는 Spring MVC 프레임워크가 있다.




1. Spring 프레임워크의 "프레임 워크"란 무엇인가?



프레임워크는 

비기능적 요구사항을 만족하는 구조와 구현된 기능을 안정적으로 실행하도록 제어 해주는 

잘 만들어진 구조의 라이브러리 덩어리이다.


프레임워크는 애플리케이션들의 최소한의 공통점을 찾아 하부 구조를 제공함으로써 개발자로

하여금 시스템의 하부구조를 구현하는데 들어가는 노력을 절감해준다.




2. 프레임워크를 왜 사용할까?



비기능적인 요소들을 초기 개발 단계마다 구현해야 하는 불합리함을 극복해준다.

기능적인 요구사항에 집중 할 수 있도록 해준다.

디자인 패턴과 마찬가지로 반복적으로 발견되는 문제를 해결하기 위한 특화된 solution을 제공한다.




3. 프레임워크는 디자인패턴과 관련이 있나?



프레임워크의 핵심적인 특징이 디자인 패턴이다. 

하지만 프레임워크는 디자인 패턴이 아니다.


디자인패턴은 애플리케이션을 설계할 때 필요한 구조적인 가이드라인이 되어 줄수는 있지만 구체적으로

구현된 기반코드를 제공하지 않는다.


프레임워크는 디자인 패턴과 함께 패턴이 적용된 기반 클래스 라이브러리를 제공해서 

프레임워크를 사용하는 구조적인 틀과 구현코드를 함께 제공한다.




4. 프레임워크의 구성요소와 종류



IoC(Inversion of Control)


IoC란 "제어의 역전" 즉 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 

개발자가 아닌 컨테이너가 대신 해준다는 뜻이다.

즉 컨테이너 역할을 해주는 프레임워크에게 제어하는 권한을 넘겨서 개발자의 코드가

신경써야 할 것을 줄이는 전략이다.



프레임워크의 동작원리를 제어흐름이 일반적인 프로그램 흐름과 반대로 동작하므로 IoC라고 한다.


Spring 컨테이너는 IoC를 지원하며, 메타데이터(XML설정)을 통해 beans를 관리하고

어플리케이션의 중요부분을 형성한다.


Spring 컨테이너는 관리되는 bean들을 의존성주입(Dependency Injection)을 통해

IoC를 지원한다.




5. 프레임워크와 라이브러리의 차이점


프레임워크는 특정부분의 기술적인 구현을 라이브러리 형태로 제공한다.

Class Library라는 구성요소는 프레임워크의 정의 중 하나인 Semi Complete(반제품)이다.



 특징

 프레임워크

 라이브러리

 유저코드의 작성

 프레임워크 클래스를 서브클래싱해서 작성

 독립적으로 작성

 호출흐름

 프레임워크코드가 유저코드를 호출

 유저코드가 라이브러리를 호출

 실행흐름

 프레임워크가 제어

 유저코드가 제어

 객체의 연동

 구조프레임워크가 정의

 독자적으로 정의



- 프레임워크와 라이브러리를 구분하는 방법은 실행제어가 어디서 일어나는 가에 달려있다.

- 라이브러리는 개발자가 만든 클래스에서 직접 호출하여 사용하므로 실행의 흐름에 대한 제어를 개발자의 코드가 관장하고 있다.

- 프레임워크는 반대로 프레임워크에서 개발자가 만든 클래스를 호출하여 실행의 흐름에 대한 제어를 담당한다.


디자인 패턴 + 라이브러리 = 프레임워크


- 프레임워크는 디자인 패턴과 그것이 적용된 기반 라이브러리의 결합이다.

- 프레임워크를 확장하거나 커스터마이징 할때는 프레임워크에 적용된 패턴에 대한 이해가 필요하다.




프로젝트에서 sts를 사용해보았는데 익숙하지 않아 

간단하게 mysql을 이용해 data에 접근하는 방법을 알고 싶었다.

다행히도 자세하게 가이드가 된 문서(https://spring.io/guides/gs/accessing-data-mysql/)

가 있어 블로그에 정리하게 되었다.


sts를 이용해 mysql의 data를 접근하는 방법



1. STS 설치 후 패키지 익스플로러로 workspace 생성한다.



2. 다음과 같이 패키지 구조가 생성되었다면



lombok.jar를 다운(https://projectlombok.org/download)

받아 자신이 사용하는 sts나 eclipse 위치를 지정해주고 설치한다.




3. pom.xml 을 열어 다음과 같이 수정한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>org.springframework</groupId>
    <artifactId>gs-mysql-data</artifactId>
    <version>0.1.0</version>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>        
 
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.23.1-GA</version>
        </dependency>
        <dependency
            <groupId>org.projectlombok</groupId
            <artifactId>lombok</artifactId
            <scope>provided</scope
        </dependency>
    </dependencies>
 
    <properties>
        <java.version>1.8</java.version>
    </properties>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.19.1</version>
            </plugin>            
        </plugins>
        
    </build>
 
</project>
cs


pom.xml 수정이 완료되면 

MySQL 8.0 Command Line Client - Unicode 라는 터미널을 실행시켜

db 루트 비밀번호를 입력하고



아래 커맨드라인을 입력하여 db_example 이라는 db 스키마를 생성하고 user를 만들고 비밀번호와 권한도 준다.


1
2
3
mysql> create database db_example; -- Create the new database
mysql> create user 'springuser'@'%' identified by 'ThePassword'-- Creates the user
mysql> grant all on db_example.* to 'springuser'@'%'-- Gives all the privileges to the new user on the newly created database
cs


4. 다음 hello 패키지 안에 class파일을 생성한다.

총 3개 ( MainController.java, User.java , UserRepository.java)



다음과 같이 구성되었다면 안의 내용을 아래와 같이 넣어준다.


4.1 MainController.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package hello;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller    // This means that this class is a Controller
@RequestMapping(path="/test"// This means URL's start with /demo (after Application path)
public class MainController {
    @Autowired // This means to get the bean called userRepository
               // Which is auto-generated by Spring, we will use it to handle the data
    private UserRepository userRepository;
 
    @GetMapping(path="/add"// Map ONLY GET Requests
    public @ResponseBody String addNewUser (@RequestParam String name
            , @RequestParam String email) {
        // @ResponseBody means the returned String is the response, not a view name
        // @RequestParam means it is a parameter from the GET or POST request
 
        User n = new User();
        n.setName(name);
        n.setEmail(email);
        userRepository.save(n);
        return "Saved";
    }
 
    @GetMapping(path="/all")
    public @ResponseBody Iterable<User> getAllUsers() {
        // This returns a JSON or XML with the users
        return userRepository.findAll();
    }
}
cs


4.2 User.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package hello;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Data;
 
@Entity // This tells Hibernate to make a table out of this class
@Data
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String name;
    private String email;
 
}
cs


4.3 UserRepository.java


1
2
3
4
5
6
7
8
9
10
11
12
package hello;
 
import org.springframework.data.repository.CrudRepository;
 
import hello.User;
 
// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete
 
public interface UserRepository extends CrudRepository<User, Integer> {
 
}
cs


5. 다음으로 /test/src/main/resources/application.properties 파일을 찾는다.


application.properties 파일은 비어있을텐데 이 부분에 다음과 같이 db정보를 입력해준다.


1
2
3
4
5
#spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
cs


6. 패키지를 잡고 다음과 같이 Update Maven Project를 한다.



7. 패키지를 잡고 다음과 같이 Maven install을 한다.




8. 빌드가 성공하면 서버를 올리고 웹브라우저를 열어 http://localhost:8080/test/all 를 입력해본다.


 



mysql workbench 실행하여



UserName을 springuser

password는 ThePassword를 입력하여 접속한다.



데이터가 없는것을 확인했으니 새로 넣어보자.


9. http://localhost:8080/test/add?name=sanghyun&email=shlee0882@gmail.com 을 입력하면



다음과 같이 데이터가 들어가게 된다.



데이터 조회를 해보면 json형식으로 나온것을 확인할 수 있다.



sts와 mysql을 이용하여 데이터 조회(select)와 입력(insert) 기능을 구현하였다.


소스첨부 : 

test.z01

test.z02

test.zip


출처 : https://spring.io/guides/gs/accessing-data-mysql/




Spring MVC 구조


Spring MVC는 Servlet Container 안에 있는 Servlet 요소 중 하나이다.



Spring MVC(Model-View-Controller)의 핵심 Component는 아래와 같다.

Component개요
DispatcherServletSpring MVC Framework의 Front Controller, 웹요청과 응답의 Life Cycle을 주관한다.
HandlerMapping웹요청시 해당 URL을 어떤 Controller가 처리할지 결정한다.
Controller비지니스 로직을 수행하고 결과 데이터를 ModelAndView에 반영한다.
ModelAndViewController가 수행 결과를 반영하는 Model 데이터 객체와 이동할 페이지 정보(또는 View객체)로 이루어져 있다.
ViewResolver어떤 View를 선택할지 결정한다.
View결과 데이터인 Model 객체를 display한다.

이들 컴포넌트간의 관계와 흐름을 그림으로 나타내면 아래와 같다. 


  1. Client의 요청이 들어오면 DispatchServlet이 가장 먼저 요청을 받는다.
  2. HandlerMapping이 요청에 해당하는 Controller를 return한다.
  3. Controller는 비지니스 로직을 수행(호출)하고 결과 데이터를 ModelAndView에 반영하여 return한다.
  4. ViewResolver는 view name을 받아 해당하는 View 객체를 return한다.
  5. View는 Model 객체를 받아 rendering한다.

Bean


Bean(빈)이란 개발자가 생성하지 않고 Spring이 관리하는 인스턴스이다. 


Spring이 제공하는 Container를 통해서 관리되는 인스턴스를 우린 Bean이라고 부른다.


POJO

POJO는 Plain Old Java Object의 약자인데 그 어느 곳에도 종속되지 않은 (즉, 상속받지도, 구현하지도 않은 독립적인) Java Class를 말한다.



IOC 


이전의 방식

main()에서 시작할 때 사용할 객체를 결정, 객체 내의 메소드 호출 작업 일반적

오브젝트가 프로그램 흐름 결정한다.


IOC 방식

IOC는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않는다.

자신이 어떻게 만들어지고 어디서 사용되는지 모른다.

모든 제어 권한을 자신이 아닌 다른 대상에게 위임한다.



DL(Dependency Lookup)


저장소에 저장되어 있는 빈에 접근하기 위해 컨테이너에서 제공하는 API 이용해 사용하고자 하는 빈을 LOOKUP 하는 것


DI(Dependency Injection)


각 계층, 클래스 사이 필요로 하는 의존관계 컨테이너가 자동으로 연결해준다.

각 클래스 사이 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해준다.

DL 사용시 컨테이너 종속성 증가하여 이를 줄이기 위해 DI 사용한다.


각 class/객체 사이의 의존관계를 빈 설정 정보를 바탕으로 container가 자동적으로 연결해 주는 것을 말한다. 


따라서 lookup과 관련된 코드들이 오브젝트 내에서 완전히 사라지고 컨테이너에 의존적이지 않은 코드를 작성할 수 있다. 


단지 빈 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 된다.


Spring container 에서 지원한다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성이 항상 Injection 형태의 IoC를 사용하게 된다.




+ Recent posts