[Spring Basic] MyBatis
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 (0) | 2022.07.09 |
[Spring Basic] JUnit Test Framework (0) | 2022.07.09 |
[Spring Basic] 파라미터의 변환과 검증 (0) | 2022.06.24 |
댓글
이 글 공유하기
다른 글
-
[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