SqlSession 만들어 보기

 

[ JAVA 로 만들어보기 ]

public class Template {
    
    // Mybatis
    public static SqlSession getSqlSession() {
        
        //mybatis-config-xml 파일을 읽어 들여서 해당 DB와 접속된 SqlSession 객체를 생성해서 반환
        SqlSession sqlSession = null;
        
        // SqlSession 객체를 생성하기 위해서는 SqlSessionFactory 객체가 필요하다.
        // SqlSessoinFactory 객체를 생성하기 위해서는 SqlSessionFactoryBuilder 객체가 필요하다.
        // 즉, SqlSession → SqlSessionFactory → SqlSessionFactoryBuilder 객체가 필요
        String resource = "/mybatis-config.xml";	// 최상의 폴더를 의미한다.
        
        try {
            // 내가 원하는 자원과 스트림(통로)을 연결
            InputStream stream = Resources.getResourceAsStream(resource);
            
            /* 1단계)
             * new SqlSessionFactoryBuilder() : SqlSessionFactoryBuilder 객체를 생성
             *
             * 2단계)
             * .build(stream) : 통로로부터 mybatis-config.xml 파일을 읽어 들여서 
             * 				SqlSessionFactory 객체를 만든다.
             *
             * 3단계)
             * .openSession(false) : SqlSession객체 생성, 앞으로 트랜잭션 처리 시 
             *				자동으로 commit 할건지, 아닌지 여부를 결정
             *   openSession() == openSession(false)
             *   → false : 개발자가 직접 commit 하겠다.
             *   → true : 자동으로 commit 하겠다.
             *
             */
             
            sqlSession = new SqlSessionFactoryBuilder().build(stream).openSession();

			
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return sqlSession;
		
    }
	
}

 

[Spring Bean 등록]

  • root-context.xml 의 일부분이다.
  • DB 연결을 하면서 3단계에서 SqlSessionTemplate와 SqlSessionFactoryBean을 빈으로 등록하였다.
<!--  DB연결 2단계 작성 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
    <!--  mybatis 설정파일 위치를 지정 (src/main/resources)-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!-- 연결을 위한 도구 -->
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--  DB 연결 3단계 작성 -->
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
    <!--  sql 명령어 실행을 위한 도구에 대한참조 -->
    <constructor-arg ref="sqlSessionFactory"/>
</bean>

 

 

 

[사용 예시 - JAVA]

  • Spring에서가 아닌 순수 자바로만 구현 한 것입니다.
  • 에 있는 JAVA로 만들어보기에 getSqlSession() 메소드를 구현해 놨습니다.

[사용 예시 - Spring]

  • 빈 등록을 해놨으니 주입을 받아서 사용합니다.

 

 

SqlSession 메소드

 

  • sqlSession에서 제공하는 메소드를 통해서 sql문을 찾아서 실행하고 결과를 바로 받아볼 수 있다.

 

[사용 예시]

sqlSession.sql문 종류에 맞는 메소드("메퍼파일의 namespace.해당 sql문 고유한 id", 파라미터 변수);

sqlSession.insert("memberMapper.insertMember", MemberVo(생략 가능));

 

Tip) <mapper namespace="org.mybatis.example.BlogMapper"> 와 같이 클래스 경로처럼 작성해주는게 최신 작성 방법이다. 

 

[실제 사용 코드]

 

 

 

SqlSession 과 SqlSessionTemplate 의 차이

 

SqlSession

  • SqlSessionFactory를 통해서 단순하게 생성된다.
  • 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할 수 있다.
  • 필요하지 않는 상태가 되면 세션을 닫는다.
  • 스프링 트랜잭션 설정에 따라 자동으로 커밋 혹은 롤백을 수행하고 닫혀지는, 쓰레드에 안전한 SqlSession 개체가 스프링 빈에 주입될 수 있다.
  • 즉, 단순하게 SqlSessionFactory를 통해 단순하게 생성된 아이여서 Thread-Safe를 지원하지 않아 요청마다 객체 생성과 close를 해주어야 한다.

 

SqlSessionTemplate

  • 마이바티스 스프링 연동 모듈의 핵심이다.
  • SqlSession 인터페이스를 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.
  • 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할 수 있다.
  • getMapper()에 의해 리턴된 매퍼가 가진 메소드를 포함해서 SQL을 처리하는 마이바티스 메소드를 호출할 때 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다.
  • 예외를 스프링의 DataAccessException으로 변환하는 작업 또한 처리한다.
  • 마이바티스의 디폴트 구현체인 DefaultSession 대신 항상 사용된다.
    : 왜냐하면 템플릿은 스프링 트랜잭션의 일부처럼 사용될 수 있고 여러개 주입된 매퍼 클래스에 의해 사용되도록 쓰레드에 안전하다.
    : 동일한 어플리케이션에서 두개의 클래스 간의 전환은 데이터 무결성 이슈를 야기할 수 있다.
  • SqlSessionTemplate은 생성자 인자로 SqlSessionFactory를 사용해서 생성될 수 있다.
  • 즉, SqlSession 인터페이스를 구현하고, thread-Safe, 트랙잭션 관리용 이라고 보면 된다.

MyBatis3에서 SqlSession 과 SqlSessionTemplate, SqlSessionDaoSupport 개념설명 그리고 mybatis-spring 연동모듈을 사용해서, @Repository(애너테이션)을 선언해 DAO객체를 생성해서 DB에 접근하는 방법

 

SqlSession

  • MyBatis에서는 SqlSession를 생성하기 위해 SqlSessionFactory를 사용
    • 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할수 있다.
    • 더 이상 필요하지 않은 상태가 되면 세션을 닫는다.
  • MyBatis 스프링 연동 모듈을 사용
    • SqlSessionFactory를 직접 사용할 필요가 없다. 왜냐하면, 스프링 트랜잭션 설정에 따라 자동으로 커밋 혹은 롤백을 수행하고 닫혀지는, 쓰레드에 안전한 SqlSession 개체가 스프링 빈에 주입될 수 있기 때문이다.
    • mybatis-spring 의존성 `xmlorg.mybatis mybatis-spring 1.3.1`
  • Mybatis만 사용하면, SqlSessionFactory는 SqlSessionFactoryBuilder를 사용해서 생성한다. Mybatis + Spring 연동모듈(라이브러리)에서는 SqlSessionFactoryBean가 대신 사용된다.



SqlSessionDaoSupport

SqlSessionDaoSupport 객체 상속 방식

  • 애너테이션으로 sqlSession(SqlSessionFactoryBean)을 수정자(Setter)방식으로 주입해서 super(SqlSessionDaoSupport)의 setSqlSessionFactory 메서드를 호출
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>
@Repository
public class SampleDao {

    @Autowired
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        super.setSqlSessionFactory(sqlSessionFactory)
    }

    public int insert(String queryId, Object parameterObject) {
        return getSqlSession().insert(queryId, parameterObject);
    }
}



SqlSessionTemplate

SqlSessionTemplate 객체 상속 방식

  • SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심
    • SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.
    • SqlSessionTemplate 은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할수 있다.
  • SqlSessionTemplate 객체 사용
    • SqlSessionTemplate를 bean 으로 등록
    • 클래스에서 SqlSessionTemplate 필드(Field)방식으로 주입하여 사용
    • SqlSession (SqlSessionTemplate)은 프록시 사용 및 스레드 안전 SqlSession 메서드를 호출
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSession"/>
</bean> 
@Repository
public class SampleDao {

    @Autowired
    private SqlSessionTemplate sqlSession;

    public void insert(String queryId, Object parameterObject) {
        sqlSession.insert(queryId, parameterObject);
    }
}


 

 

[MyBatis]란?

앞서 사용해 보았던 Jdbc-Template도 상당히 좋은 방식 중 하나지만 이것보다 좀더 편하게 데이터베이스 엑세스를 할 수있는 추가 프레임워크가 있습니다.

MyBatis라는건데요, 이것은 꼭 스프링이 아니더라도 스프링 뿐만아니라 다른 언어와도 결합할 수 있는 프레임워크이기 때문에 배워둔다면 스프링 프레임워크가 아닌 다른언어로 웹 어 플리케이션을 제작할때도 활용할수 있는 추가 프레임워크입니다.

스프링에서 제공하는것은 아니고 iBatis라는곳에서 제공을 했지만 구글이 인수를하면서 MyBatis라는 이름으로 새롭게 지원하고있는 프레임워크입니다.

 

마이바티스를 사용했을때 어떠한 방식에 구해받지않고 공통적인 장점을 두가지를 나열해 보겠습니다.

1. 쿼리문을 수행해주는 PreparedStatement를 직접생성하지않고 해당 기능이 내부적으로 자동으로 처리됩니다.

?처리마저도 #{필드명} 매핑을통해서 자동으로 처리가 됩니다

2. RowMapper로 익명클래스를쓰느니 내부클래스를 쓰느니 했던것들을 mybatis가 내부적으로 다 처리해줘서 간편함을 얻을 수 있습니다.

 

스프링에서 사용하기 위해서는 Mybatis-Spring module을 다운로드 받아야 합니다.

Mybatis를 사용하는 방식으로는 크게 두가지로 나뉩니다

1. SqlSessionTemplate - MyBatis3.0 이전

2. MapperInterface - Mybatis 3.0버전

 

 

 

[SqlSessionTemplate]

SqlSessionTemplate는 Mybatis쿼리문을 수행해주는 역할을 합니다.

MyBatis3.0 이전에 사용하던 방식이며 DAO클래스에 직접 SqlSession객체를선언하고 @Autowired로 의존주입하여 쿼리문을 수행 하는 방식입니다.

↓ root-context.xml에 SqlSessionFactory를 등록해야합니다.

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

DAO 메서드 인자값으로 "key" key이름을 부여하며 쿼리문을 수행하는 xml파일의 <select>혹은 <insert> <update> <delete> 태그의 id속성에 동일한 key이름으로 지정  으로 DAO의 메서드와 연동합니다.

 

 

[MapperInterface]

MapperInterface는 Mybatis 3.0버전으로, DAO클래스를 쿼리문을 수행해주는 Mapper xml에서 구현합니다.

SqlSessionTemplate방식을 사용할때 작성하는 DAO클래스는 Controller->Service 로 부터 DAO 인터페이스에 선언된 추상메서드를 호출받았을때 추상메서드의 기능을 구현해 주는 클래스 입니다.

DAO클래스에서는 메서드를 통해 쿼리문을 실행하여 DB정보수행 까지 도달하기위한 쿼리문 수행 메서드를 구현합니다.

MapperInterface는 DAO클래스를 생략하고 Mapper xml파일과 DAO인터페이스를 직접 연결해주는 방식입니다.

 ↓ root-context.xml에 <mybatis-spring:scan basepacage="인터페이스의 패키지경로" />를 등록해야합니다.

<mybatis-spring:scan base-package="com.spring.database.mybatis.score.repository"/>

 ↑ 해당경로의 인터페이스를 찾고 인터페이스와 연결되있는 Mapper xml을 컨테이너에 빈등록 해줍니다

Mapper xml에서 <mapper>태그로 namespace를 지정하는데 이곳에 패키지경로.DAO인터페이스명 으로 선언해주면

해당 DAO인터페이스와 연결이 됩니다.

<mapper>태그안에는 반환되는 객체들을 미리 선언하고 <select>,<insert>,<update>,<delete>태그를 사용하여 태그안에 수행할 쿼리문을 작성합니다.

각 쿼리문 태그의 id명을 DAO인터페이스의 추상메서드 이름으로 지정합니다.

인터페이스를 구현받은 클래스에서 추상메서드를 오버라이딩 하는것과 같습니다.  

MyBatis 란?

객체지향 언어인 JAVA의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 persistence framework입니다.
persistence framwork란?

자바에서 DB 프로그래밍을 하기 위해서 JDBC가 제공되었습니다.
(기본 JDBC - 직접 DB Connection 생성, Statement 생성 및 쿼리 수행, 결과값(ResultSet) 처리를 구현해야 함)
자바는 JDBC API를 제공해주지만, 기존 JDBC만을 이용한 방식은 코드가 상당히 길어지고 반복된 코드가 존재할 뿐더러,
SQL의 변경이 필요한 경우에도 자바 프로그램을 수정하기 때문에 유연성이 좋지 못합니다.

Mybatis는 JDBC의 이러한 단점들을 개선함으로 개발자가 작성한 SQL 명령어와 자바 객체를 매핑해주는 기능을 제공하고,
기존에 사용하던 SQL 명령어를 재사용하여 코드의 중복과 무의미한 코드 작성을 생략할 수 있으면서도,
SQL문을 xml 파일에 작성하여 변환이 자유롭고 가독성이 좋습니다.

MyBatis 특징

MyBatis는 다음과 같은 특징을 갖습니다.

- 간단함 : 간단한 persistence framwork. 배우기가 쉽다.

- 생산성 : 62%정도 줄어드는 코드, 간단한 설정

- 성능 : 데이터 접근 속도를 높여주는 Join 매핑(구조적 강점) ,
여러 방식의 데이터 가져오기 전략(가져오기 미루기, SQL줄이기 기법)

- 관심사의 분리 : 설계를 향상 (유지보수성) 리소스를 관리하여 계층화를 지원
(Connection, PreparedStatement, ResultSet)

- 작업의 분배 : 팀을 세분화하는 것을 도움

- SQL문이 어플리케이션 소스 코드로부터 완전 분리

- 이식성 : 어떤 프로그래밍 언어로도 구현 가능

- 오픈소스이며 무료이다.

MyBatis 사용 방식

MyBatis를 이용할 때 SQL문을 사용하는 방식은 크게 3가지로 나뉠 수 있습니다.

1. xml만을 이용한 SQL문을 설정, DAO에서는 XML을 찾아서 실행하는 코드로 작성하기
- 장점 : SQL문은 별도로 xml로 작성되어 SQL문의 수정이나 유지보수에 적합하다.
- 단점 : 개발 시 코드의 양이 많아지고, 복잡성이 증가한다.

2. Annotation과 인터페이스만을 이용하여 SQL문을 설정
- 장점 : 별도의 DAO 없이도 개발가능하여 생산성이 크게 증가한다.
- 단점 : SQL문을 Annotation으로 작성하므로, 수정이 필요할 경우 매번 다시 컴파일 해야한다.

3. 인터페이스와 xml로 작성된 SQL문 활용
- 장점 : 간단한 SQL문은 Annotation으로 / 복잡한 SQL문은 xml로 처리하여 유연성이 좋다.
- 단점 : 개발자에 따라 개발 방식 차이로 인해 유지보수가 중요한 프로젝트에서는 부적합하다.

 

JPA VS MyBatis 및 각각의 장단점


아래 그림은 구글 트렌드를 이용한 JPA와 마이바티스 중 어떤 것을 더 많이 사용하는지 나타낸 표입니다.

동아시아를 제외하고 대부분의 나라에서는 JPA를 압도적으로 많이 사용하고 있다는 것을 알 수 있습니다.
그만큼 JDBC를 직접 사용하는 Mybatis보다 JDBC를 노출하지 않고 ORM 기술을 사용하는 JPA를 선호한다는 것을 알 수 있겠습니다.
(각각 장단점이 존재하기 때문에 서비스에 따라 Mybatis를 사용할지 JPA를 사용할지 스스로 결정하는 것이 좋습니다.)

JPA

Java Persistence API의 약자로 Java ORM 기술에 대한 API 표준 명세를 말합니다.
JPA는 단순한 명세이기 때문에 JPA만 가지고는 어떤 구현 기술을 사용할 수 없습니다.
실제로 우리가 사용하는 Repository는 Spring Data JPA로 부터 제공되는 기술입니다.
Spring Data JPA는 JPA를 간편하게 사용하도록 만들어놓은 오픈 소스일 뿐입니다.
이와 비슷한 기술로 다양한 라이브러리가 존재합니다.
그리고 JPA를 사용하다 보면 Hibernate를 많이 사용하게 되는데 Hibernate는 JPA의 구현체라고 할 수 있습니다.
Hibernate 이외에도 EclipseLink, DataNucleus 등 다양한 JPA 구현체가 존재합니다.
그래도 우리가 Hibernate를 사용하는 이유는 가장 범용적으로 다양한 기능을 제공해주기 때문입니다.

장점

  • 1차캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능상 이점을 얻을 수 있다.
  • 코드 레벨로 관리 되므로 사용하기 용이하고 생산성이 높다.
  • 컴파일 타임에 오류를 확인할 수 있다.
  • 데이터베이스에 종속적이지 않으므로 특정 쿼리를 사용하지 않아 추상적으로 기술 구현이 가능하다.
  • 엔티티로 관리되므로 스키마 변경시 엔티티만 수정하게 되면 엔티티를 사용하는 관련 쿼리는 자동으로 변경된 내역이 반영된다.
  • 개발 초기에는 쿼리에 대한 이해가 부족해도 코드 레벨로 어느 정도 커버가 가능하다.
  • 객체지향적으로 데이터를 관리할 수 있다.
  • 부족한 부분은 다양한 쿼리 빌더와 호환하여 보안할 수 있다.

 

단점

  • JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있다. (로직이 복잡하거나 불필요한 쿼리가 발생할 수 있다.)
  • 초기에는 생산성이 높을 수 있으나 점차 사용하다 보면 성능상 이슈가 발생할 수 있다.(N+1, FetchType, Proxy, 연관관계)
  • 고도화 될수록 학습 곡선이 높아질 수 있다. (성능 이슈의 연장선으로 해결 방안에 따라 복잡한 내부 로직을 이해해야 할 필요가 있다)

 

MyBatis

사실 MyBatis와 JPA는 비교 대상이 되지 않을 수 있습니다.
왜냐하면 JPA는 ORM 기술로 분류되고, MyBatis는 SQL Mapper의 한 종류이기 때문입니다.
MyBatis는 xml과 Annotation을 사용하여 primitive타입과 Map 인터페이스, 자바 POJO 객체를 설정하여
DB record에 사용할 수 있습니다.

장점

  • SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현할 수 있다.
  • 엔티티에 종속받지 않고 다양한 테이블을 조합할 수 있다.
  • 복잡한 쿼리도 SQL 쿼리만 작성할 수 있다면 손쉽게 작성할 수 있다.

 

단점

  • 스키마 변경시 SQL 쿼리를 직접 수정해주어야 한다.
  • 반복된 쿼리가 발생하여 반복 작업이 있다.
  • 런타임시에 오류를 확인할 수 있다.
  • 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
  • 데이터베이스 변경시 로직도 함께 수정해주어야 한다.

 

ERP.pptx
3.00MB

https://github.com/sexyflowermins/green_erp

 

GitHub - sexyflowermins/green_erp

Contribute to sexyflowermins/green_erp development by creating an account on GitHub.

github.com

 

 

hotel_dodam.pptx
4.15MB

https://github.com/sexyflowermins/hotel

 

 

1. 템플릿 엔진 JSP 연결하기 위해서 설정해야 하는 것들 확인하기 
2. webapp → WEB-INF → view 폴더 생성하기 
3. mvc → prefix, suffix 설정 및 JSP 동작 확인

스프링 레거시 버전일떄의 사용방법

스프링 레거시 버전에 설정 파일 
web.xml : 서버 포트 및 서버 관련 설정 
root-context.xml : 데이터 베이스 설정 관련(한번만 new 되고 더이상 new 될 필요 없는) 
servlet-context.xml : 지속적으로 new 해서 만들어서 사용해야 하는 것들 
spring boot 에서는 구분할 필요가 없음. 하나의 파일로 설정 처리 한다고 생각하면 된다.

temp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>여기는 후미진 어느 언덕입니다</h1>
</body>
</html>

'Spring boot > Spring boot 3단원 JPA & Security' 카테고리의 다른 글

yml 기본개념  (0) 2023.05.10
mysql 설정 및 yml 파일 설정  (0) 2023.05.10
프로젝트 생성 및 Git 설정  (0) 2023.05.10

yml 파일에 기본 개념

우리가 개발하고 있는 프로그램 들을 혼자 독립적으로 실행도 가능 하지만 일반적으로 다른 시스템과 함께 연계해서
동작하는 것이 일반적입니다. 그래서 타 시스템 간에 프로세스들을 상호 작용하기 위해서는 결국 데이터들을
주고 받아야 하고 이를 원할 하게 수행 시키기 위해서는 나의 프로그램과 다른 시스템 사이에 데이터를 주고 받을 때
데이터 포맷에 대한 약속이 필요 합니다.

XML 과 Json 과 Yaml 형태 살펴 보기

xml은 태그 형식을 통해서 **Key**와 **Value**를 구분하고, 태그 안에 태그를 
넣어서 부모와 자식 관계의 구조를 나타냅니다.

하지만  위에 부분에서 확인 가능하듯이 **Object**와 **Array** 부분은 표시를 해놨지만
Xml포맷 상으로는 구분이 안되는 경우도 있습니다.

Json은
Object 일 경우 {} 로 감싸주고있고, Array일 경우 [] 사용합니다.

Yaml은 문법에 엄격한 규칙이 존재합니다.

1. key 와 value 사이에 한 칸이 띄워져 있어야 합니다.
2. yml 파일은 json 형식과 다르게 중괄호{} 없이 스페이스 2칸 입니다.
3. -(하이픈)을 통해서 Array임을 나타냅니다.

즉 들여쓰기 규칙은 스페이스 2칸 입니다. 규칙을 지키지 않으면 동작하지 않습니다.

 

+ Recent posts