이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[Spring Basic] MyBatis

  • 2022.07.12 15:40
  • Spring/Spring

 

 

 

MyBatis는 자바 코드와 SQL을 매핑해주는 프레임워크다.

SQL문을 별도의 xml파일로 분리해 자바 코드에서 SQL을 직접 작성하지 않고 간편하게 작성할 수 있게 도와준다.

 

 

 

 

MyBatis가 JDBC드라이버를 사용해 DB와 통신하고, Spring을 사용할 때는 MyBatis와 Spring을 연결해주는 mybatis-spring을 설치해 사용한다.

 

 

 

 

 

 

MyBatis를 사용하기 전에는 SQL 구문을 자바의 String 객체에 직접 저장하고 SQL을 데이터베이스에 보내는 방식으로 데이터베이스와 통신했었지만, MyBatis가 도입된 이후부터는 xml에 SQL을 작성해 데이터베이스와 통신한다.

 

MyBatis에서 SqlSession을 생성하려면 SqlSessionFactory 의 구현체가 필요하다.

 

SqlSessionFactory는 멀티쓰레드에 안전하기에 여러 DAO에서 SqlSession을 공유해서 사용해도 괜찮다.

따라서 Spring을 사용하는 입장에서는 구현체만 bean으로 등록하고 싱글톤으로 관리하면 된다.

 

 

 

 

 

xml에 sql을 저장해놓고, SqlSession의 메서드들을 사용해 각각의 sql문들을 호출해주면 myBatis가 알아서 처리해준다.

 

 

 

 

 

 

xml파일에 sql문법을 하나씩 작성해두고 호출할 때 메서드 이름을 입력한다.

xml의 namespace로 아이디를 구별해 모호함을 피할 수 있다.

 

 

 

 

xml을 통해 sql문법을 관리하는데, 이 때 실제 sql문에서는 각각 PreparedStatement와 Statement를 사용하도록 바뀐다.

 

#을 통해 파라미터를 매핑하는 경우 내부적으로 PreparedStatement를 사용한다.

파라미터를 문자열로 치환하지 않고 SQL 구문에 값을 넣게 되고, SQL Injection 공격을 방지할 수 있다.

 

SELECT * FROM users WHERE id = #{userId}
SELECT * FROM users WHERE id = ?

 

SQL 이 실행될 때 ? 가 실제 값으로 대체된다.

 

 

$를 통해 파라미터를 매핑하는 경우 내부적으로 Statement를 사용한다.

파라미터 값을 문자열로 치환해서 SQL 구문에 값을 넣게 되니 SQL Injection 공격에 취약하지만 동적으로 쿼리를 구성할 수 있다.

 

SELECT * FROM ${tableName} WHERE id = #{userId}
SELECT * FROM users WHERE id = ?

${tableName} 은 파라미터 값으로 직접 치환된다.

 

외부에서 입력받은 값을 사용할 경우 꼭 검증을 먼저 수행하고 사용하자.

 

 

PreparedStatement는 SQL 구문의 틀을 먼저 정의하고 틀에 들어가는 값은 나중에 채워넣는 방식으로 동작한다.

Statement는 바로 파라미터 값을 치환한다.

 

SELECT * FROM users WHERE name = 'admin'; 
SELECT * FROM users WHERE name = 'admin'; DROP TABLE users;

 

Statement를 사용해서 SQL을 작성하는 경우 위의 경우에 name 파라미터의 값을 조작하면 users 테이블이 드랍될 수 있다.

 

 

 

 

 

 

xml안에서 sql문을 관리할 때 태그를 잘 처리해 줘야 한다.

 

특수문자는 태그로 오해받을 수 있으니 적절히 변환해서 사용하거나, 전체를 CDATA태그로 감싸서 안쪽에는 xml태그가 없다고 알려주고 자유롭게 작성하도록 하자. 

 

 

 

반응형

'Spring > Spring' 카테고리의 다른 글

[Spring Basic] JPA와 AOP  (0) 2022.07.29
[Spring Basic] 동기와 비동기  (0) 2022.07.15
[Spring Basic] DAO Repository DTO VO Entity  (1) 2022.07.09
[Spring Basic] JUnit Test Framework  (0) 2022.07.09
[Spring Basic] 파라미터의 변환과 검증  (0) 2022.06.24

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Spring Basic] JPA와 AOP

    [Spring Basic] JPA와 AOP

    2022.07.29
  • [Spring Basic] 동기와 비동기

    [Spring Basic] 동기와 비동기

    2022.07.15
  • [Spring Basic] DAO Repository DTO VO Entity

    [Spring Basic] DAO Repository DTO VO Entity

    2022.07.09
  • [Spring Basic] JUnit Test Framework

    [Spring Basic] JUnit Test Framework

    2022.07.09
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (611) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (69)
      • Operating System (18)
      • Computer Network (17)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (14)
    • Life Logs (4) N
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바