프로그래밍

스프링 프레임워크 요약정리

코딩딩 2016. 6. 9. 21:38

Spring Framework


1. 스프링 프레임워크 란?

   객체관리 컨테이너 -> 스프링 컨테이너에 사용할 객체를 등록해두고 필요할때 가져다가 사용

   객체 라이프사이클 관리 + 객체간의 의존관계 관리


  * 의존성 역전 : 내가 생성해야될 객체를 내가 만들지 않고 나를 사용하는 객체가 대신 객체를 생성해서 나에게 넘겨주는것


2. 스프링컨테이너를 만드는방법(XML을 이용하는 방법)

    • 전부다 XML로 설정하는 방법
    • 에노테이션을 사용하는 방법
    • 전부다 XML로 설정하는 방법

- 스프링 컨테이너 설정파일을 작성하고 설정파일을 매개로 컨테이너 객체를 생성

 : Spring Bean Configuration File 선택

   관례적으로 applicationContext.xml이라고 이름을 씀

 

- 관리하는 객체를 빈이라는 이름으로 부르고 관리


객체 생성 : Robot robot = new Robot();


빈 등록 : <bean id="robot" class="Robot"> </bean>

bean태그에 객체 생성할 클래스명 적어주면 해당 클래스의 객체를 컨테이너에 담음

(xml파일이므로 풀패키지명으로 적어줌)

컨테이너에 담겨있는 bean들을 구분할 수 있는 식별자는 id에 작성


실제 사용할 객체 생성

스프링 컨테이너 설정파일을 매개변수로 해서 GenericXmlApplicationContext 객체 생성


의존성 주입

 : 전략패턴(리스코프치환 + 의존성역전원칙)이 적용된 상태에서 객체를 만들어서 넣어주는 작업 


 느슨한 결합 ( 정해진 타입만이 아니라 여러가지 타입을 주입받을수 있도록 결합)

 리스코프 치환원칙 적용하여 만들어줌

 1. 사용할 기능에 대해 추상적으로 명시 (인터페이스 생성)

 2. 사용할 기능의 타입을 1에서 명시한 추상적 타입으로 설정해줌

 3. 추상적인 기능에 대해 구체적으로 구현하는 클래스(들)을 작성


-> 리스코프치환원칙이 적용되고나면 추상기능을 명시하는 인터페이스를 구현하는 클래스의 객체라면 어떤 객체든지 적용가능


의존성 주입 방법


1. 설정자 주입

 : <property name=" " ref=" "/> 태그를 이용하여 설정자를 주입

name은 setter에서 set으로 시작하는 함수의 set떼고 첫글자 소문자된 이름

ref에는 같은 컨테이너에 들어있는 다른 빈 객체의 id


2. 생성자 주입

 스프링 컨테이너는 기본적으로 빈 객체를 만들때 기본 생성자를 사용함.

 기본 생성자가 아닌 생성자를 통해 객체를 생성하려면 어떤 매개변수를 받는 생성자에 어떤 값을 넣을지를 constructor-arg 태그를 통해 지정해줘야함


    • 에노테이션을 사용하는 방법

     - @Component 어노테이션을 클래스(빈으로 등록할)에 적어줌

        id는 기본적으로 클래스명의 첫글 소문자


- 컨테이너 설정(applicationContext.xml)에 에노테이션을 찾을수 있도록 

<context:component-scan base-package="패키지명"/> 태그를 달아줌 

( 이걸하려면 Namespaces탭에서 context를 체크해줘야함)



Spring-jdbc


Java기본 JDBC의 불편한점?

 -  구문관리객체 PreparedStatement 또는 ResultSet객체를 직접관리해야함 : 예외처리, 사용후 close

이는 Dao가 Connection을 직접 관리하기 때문에 발생하는 문제

그래서! Connection을 관리해주는 응용계층의 객체, Session 사용


- JdbcTemplate

 : Spring-JDBC에서 제공하는 Session역할(Connection관리작업을 대신해 주는)을 해주는 객체

   jdbcTemplate가 어떻게 connection을 연결할지에 대한 정보는 java.sql.DataSource 인터페이스를 구현하는 객체를 활용

   -> DataSource를 이용해 우리가 필요한 sql문 셔틀

 DataSource구현체 : 디비에 연결하기 위한 정보 집합


- Dao

 : 우리가 필요한 sql문을 JdbcTemplate에 적절하게 날리고 결과값 처리


작업순서


1. 스프링컨테이너에 DataSource구현체를 빈으로 등록 (디비접속 정보를 넣어서)

2. JdbcTemplate을 빈으로 등록(DataSource 넣어서)

3. JdbcTemplate을 사용하는 Dao작성

4. 작성한 Dao를 빈으로 등록(JdbcTemplate 넣어서)



1. 스프링컨테이너에 DataSource구현체를 빈으로 등록 (디비접속 정보를 넣어서)

: 어떻게 디비에 접속할지 + 커넥션을 어떻게 관리 할지


 스프링에서 제공하는 단순한 DataSource구현체 :  org.springframework.jdbc.datasource.DriverManagerDataSource

 

스프링 설정파일에 빈등록


1
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
cs


property태그를 이용해서 DB접속정보(driver, url, DB username, password 설정


1
2
3
4
<property name="driverClassName" value ="com.mysql.jdbc.Driver"></property>
<property name="url" value ="jdbc:mysql://localhost/hj"></property>
<property name="username" value = "자신의 mysql 아이디"></property>
<property name="password" value = "자신의 mysql 비밀번호"></property
cs


2. JdbcTemplate을 빈으로 등록(DataSource 넣어서)

: Connection에 sql을 입력하고 결과를 받아오는 역할


JdbcTemplate 빈으로 등록

1
2
3
<bean class = "org.springframework.jdbc.core.JdbcTemplate" id ="jdbcTemplate">
<property name="dataSource" ref = "dataSource"></property>
</bean>
cs


2-1. NamedParameterJdbcTemplate

: sql문에 파라미터를 매핑할때 이름을 기반으로해서 매핑시킬 수 있음

  Map과 같은 방식으로 sql문 만들때 ? 대신 이름을 적고 이름을 key로 그 자리에 넣을 값을 value로 맵을 만들어서 넣어줌

  사용되는 Map객체를 만드는 방법은 4가지


     

 자바 유틸 컬렉션이용 

Spring라이브러리 

 한개 넣을때

 SingleMap

 

 여러개 넣을때

 HashMap

 



3. JdbcTemplate을 사용하는 Dao작성

: 직접 구문객체 얻어서 쓰고 닫고할 필요가 없음, 예외처리를 할 필요가 없음 -> 코드가 간단해짐

1
2
3
4
5
6
7
8
9
10
11
public class MemberDao {
    
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
    this.jdbcTemplate = jdbcTemplate;
    }
 
    public void insertMember(Member member){
    String sql = "insert into member values(?,?,?,?,?)";
    jdbcTemplate.update(sql,member.getId(),member.getPw(),member.getName(),member.getEmail(),member.getReqDate());
    }
}
cs


4. 작성한 Dao를 빈으로 등록(JdbcTemplate 넣어서)

1
2
3
<bean class ="Dao.MemberDao" id ="memberDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
cs





MyBatis


: 개발자가 지정한 sql, 매핑을 지원하는 퍼시스턴스 프레임워크.


    • 구성
      •   환경설정파일 : 마이바티스 전반에 걸친 세팅

- 매핑설정파일이 어디에 있는지

- 디비에 어떻게 접속할 건지

- 사용할 모델클래스들에 대한 별명


      • 매핑설정파일

-사용할 sql문들에 대한 정의

   

      • Session빌드 및 사용

-실제 sql문 실행






    • 설정방법
    1. 기본    

1) 환경설정파일 작성 configuration.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
<?xml version="1.0" encoding="UTF-8" ?
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
 
<typeAliases>
 
<typeAlias type="model.Dept" alias="dept" />
 
</typeAliases>
 
<environments default="development">
 
<environment id="development">
<transactionManager type="MANAGED">
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driverClassName" value ="com.mysql.jdbc.Driver"></property>
<property name="url" value ="jdbc:mysql://localhost/hj"></property>
<property name="username" value = "자신의 mysql 아이디"></property>
<property name="password" value = "자신의 mysql 비밀번호"></property
</dataSource>
</environment>
</environments>
 
<mappers>
<mapper resource = "dao/deptMapper.xml"/>
</mappers>
 
</configuration>
cs



2) 모델클래스 (구조체) 생성


3) 매퍼파일 작성 mapper.xml

    : 여기에 우리가 사용할 sql문들을 등록해 놓고 sqlSession을 통해서 호출하여 사용


1
2
3
4
5
6
7
<mapper namespace="dao.deptMapper">
 
<insert id="insertDept" parameterType="dept">
insert into dept values
(#{deptno}, #{dname}, #{dloc})
</insert>
</mapper>
cs


db 결과 테이블의 컬럼명과 결과타입의 멤버변수 이름이 같다면 결과타입의 객체를 만들어서 해당 맴버변수에 맞게 넣어서 모델 객체로 돌려줌


4) DAO작성

:SqlSessionFactory를 멤버로 유지하면서 필요할때 SqlSession을 open해서 사용하고 다 쓰면 sqlSession을 close


 - 생성자에서 SqlSessionFactoryBuilder를 이용해서 sqlSessionFactory객체 생성

 - 각 메소드 마다 SqlSessionFactory를 이용해서 sqlSession을 open

 - 사용후 sqlSession을 close


2. 애노테이션으로 매핑 구문 설정 (인터페이스)


1)구현할 DAO의 인터페이스에서 각 함수에 에노테이션을 이용해 sql에 대한 정보를 넣어줌

1
2
3
4
public interface IDeptDao {
@Insert("insert into dept values (#{deptno}, #{dname}, #{dloc})")
public void insertDept(Dept dept);
}
cs

2) configuration.xml에 mapper class 속성에 애노테이션이 박힌 인터페이스의 풀패키지명을 적어줌.


3)DAO 클래스 작성

기본설정 방법과 동일

단, 인터페이스를 implement한 DAO를 구현하고  getMapper를 이용해서 sql구문을 호출


1
session.getMapper(IDeptDao.class).insertDept(dept);
cs

3. xml과 애노테이션(인터페이스)를 둘다 사용

1) xml만 사용하는 버전처럼 환경설정 파일작성

2) 사용할 인터페이스 추가

:mapper.xml의 네임스페이스 풀패키지명에 맞게 인터페이스 작성

 mapper.xml의 구문아이디에 1:1 대응되게 함수 선언


3) mapper.xml의 namespace를 연결되고자 하는 인터페이스의 풀패키지명으로 지정

4) 애노테이션으로 매핑구문 설정한 버전 처럼 getMapper를 얻어서 함수 호출

: 매칭된 매퍼 파일의 함수이름과 같은 구문아이디를 가진 sql이 호출됨



MyBatis-Spring연동하기


 MyBatis에서 사용하던 객체들을 스프링컨테이너에 등록해두고 필요할때 가져다가 사용


    • SqlSessionFactoryBulider

 : 설정정보를 읽어서 SqlSessionFactory를 만드는 역할

    • SqlSessionFactory

     : SqlSession을 만드는 역할

       환경설정정보 (configuration.xml)에 있는 정보들이 필요함 : 디비연결정보, 매퍼 위치, type alias에 대한 정보

    • SqlSession

     : 실제 sql을 날리기 위해 필요



방법1.


1. dataSource를 스프링 컨테이너에 등록 (applicationContext.xml 파일에 bean으로 등록)

1
2
3
4
5
6
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value ="com.mysql.jdbc.Driver"></property>
<property name="url" value ="jdbc:mysql://localhost/hj"></property>
<property name="username" value = "자신의 mysql 아이디"></property>
<property name="password" value = "자신의 mysql 비밀번호"></property
</bean>
cs


2. 기존에 DAO가 멤버로 유지하던 SqlSessionFactory를 스프링 컨테이너에 등록

 : DB연결정보, 모델별명정보, 매퍼파일위치 정보 설정 


1
2
3
4
5
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="model"></property>
<property name="mapperLocations" value="classpath*:dao/mapper/**/*.xml"></property>
</bean>
cs


classpath*:dao/mapper/**/*.xml

dao패키지 안 mapper패키지안 의 모든 하위 패키지의 모든 xml을 가져오라는 의미



3. Dao에서 SqlSessionFactory를 직접만들지 않고 스프링 컨테이너에 등록되어있는 객체 주입받으므로 생성자 필요없음


4. DAO를 어노테이션으로 스프링컨테이너에 등록해주고 sqlSessionFactory를 autowired로 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class DeptDao implements IDeptDao {
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    public List<Dept> selectAll(){
    SqlSession session = sqlSessionFactory.openSession();
    try{
        return session.selectList("dao.deptMapper.selectAll");
    }
    finally{
        session.close();
    }
}
cs




방법2.


sqlSessionFactory는 sqlSession을 만들기 위해 필요

sqlSessionFactory를 Dao에서 멤버로 유지한 이유는 sqlSession이 쓰레드 안전하지 않기때문에 한개의 session만 open됐다가 사용후 close 해줘야하기때문.

그러나 스프링연동후에는 SqlSession객체를 스프링에서 관리해줄 것이기 때문에 Session을 그냥 사용해도 무방.


1. 스프링 컨테이너에 SqlSession 등록 

  : sqlSession을 만들기위해 sqlSessionFactory 필요 -> sqlSessionFactory를 생성자주입해줌.


1
2
3
<bean id="sqlSession" class ="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name ="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
cs


2. DAO를 어노테이션 방식으로 스프링 컨테이너에 등록

1
2
3
4
5
@Component
public class DeptDao2 {
    @Autowired
    private SqlSession session;
}
cs

 




방법3.


인터페이스 연동해서 mapper객체를 통해 구문 호출


1. 매퍼 파일에 매칭될 인터페이스 풀패키지명을 적어줌

<mapper namespace="dao.IDeptDao">


2. DAO에서 session.getMapper를 이용해서 필요한 기능 호출

session.getMapper(IDeptDao.class).selectAll();


3. 매퍼 객체 빈으로 등록

매퍼 객체를 유지하지 않고 DAO의 각 메소드 마다 getMapper해서 사용했던 이유는 매퍼 객체가 쓰레드 안전하지 않기 때문 but, 스프링연동버전에서는 저 매퍼 객체를 컨테이너에 빈으로 등록해 놓고 그냥 사용 가능.


1
2
3
4
<bean id="deptDao3" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="dao.IDeptDao"></property>
<property name="sqlSessionTemplate" ref ="sqlSession"></property>
</bean>
cs


* DAO의 기능

 : DB와 연결 (connection 관리) -> session 객체 스프링 컨테이너에 등록 후 사용

 : sql문 처리 + 결과값 받기 -> sql문은 mapper.xml에 mapper객체는 스프링 컨테이너에 등록후 getMapper로 사용


-> DAO를 따로 작성할 필요가 없음!

-> 최종 버전의 MyBatis-Spring연동

'프로그래밍' 카테고리의 다른 글

개발자 커뮤니티 모음  (0) 2016.03.29