안녕하세요. 오늘은 MyBatis에서 여러건의 Record를 삽입하기 위해서 쓸 수 있는 태그에 대해 공유하고자 합니다. 우선 insert 쿼리문을 보면 INSERT INTO ROOM(type, deal_type, status) VALUES ('원룸', '월세', '광고중'); 이런 형태로 native 쿼리를 작성해야 할텐데요. JPA 처럼 saveAll() 기능을 제공하게 된다면 매우 편하게 삽입작업을 할 수 있겠지만 MyBatis는 쿼리문을 직접 작성하기 때문에 List의 갯수만큼 insert mapper를 호출하거나 해야했을 것입니다.(이렇게 썻다면 정말 안타까운 상황이네요ㅠㅠ) 예컨데 v1 public class Service { public void addRoom(String type, Stri..
native 쿼리를 직접 작성하는 JDBCTemplate이나 MyBatis 같은 기술은 항상 쿼리문을 직접 관리해야한다는 안좋은 단점이 있다. 물론 특정 DBMS에 맞는 native Query를 직접 작성하는 이점으로 각 쿼리마다 최적화할 수 있다는 장점이 있지만 한두개정도이지 임계점이 넘어가게되면 부담이 될 수밖에 없다. 그 중에서 중복으로 사용되는 조건이나 복잡한 다이나믹 쿼리 조건이 여러 쿼리에서 동시에 사용해야될 경우 xml 쿼리 파일의 용량은 그 배수만큼 커질 것이다. (예를 들어, 페이징의 경우 where절 로직은 메인 Select 문과 count 문의 조건이 limit offset을 제외하고 동일해야한다.) 뭐 예를 들면, 아래와 같다. 다방에서 매물 목록을 조회하는 페이징 API를 호출한다..
안녕하세요. 오늘은 MyBatis에서 choose 절을 활용한 동적쿼리를 만드는 방법들에 대해서 소개해보려고 합니다. 보통 특정 조건에 따라 쿼리의 형태가 다이나믹해지도록 구성하기 위한 방법으로 많이 사용되는 절입니다. 사용되는 xml 태그는 ,, 세가지 종류입니다. 하나씩 살펴보겠습니다. 구조 및 사용법select * from tableA where deleted = false and a = 1 and a = 2 and a is not null 전체 choose 조건문의 범위를 결정하는 태그를 시작으로 의 test 속성을 통해 조건을 건다.a 라는 변수는 자바 Interface Mapper에서 넘어온 파라미터를 그대로 사용할 수 있다. 태그는 "그 외에는" 이라는 느낌인데, 때로는 default의 의미..
안녕하세요. 오늘은 마이바티스를 활용하여 간단한 단일 조건문을 구성하는 방법을 소개하겠습니다. 이전에 포스팅했던 choose, when, otherwise를 구성하여 복합적으로 작용하는 dynamic sql을 구현하는 방법을 작성했었는데요.sas-study.tistory.com/383 절은 상당히 간단하면서도 절과 거의 똑!같!이! 사용된다고 보시면 됩니다. 일단 보시죠! 구조 및 사용법select * from tableA where deleted = false and a = #{a} and b = #{b} 일단 가장 일반적으로 활용하는 경우는 select 문의 where 절의 조건으로 넘어온 파라미터의 not null 여부에 따라서 조회 조건에 추가할 지 말지를 결정하는 경우가 있다. 예컨데 리스트 검..
update, insert 쿼리보통 update, insert 를 하는 경우 mapper xml 파일에 다음과 같이 적곤 한다. INSERT INTO TABLE_A (column1, column2, column3) VALUES (#{param1}, #{param2}, #{param3}); UPDATE TABLE_A SET column2 = #{param} WHERE seq = #{seq}; 거의 대부분은 이런식일 것이다. 이렇게 seq가 정해지고 딱딱 들어간다면 얼마나 좋을까..하지만 실무에서는 특정 where 절에 대하여 조건을 가진 행만이 update되고 이는 사전에 어떤 seq를 가지는 row가 update 처리가 될지 미리 예측하기는 같은 조건으로 select를 해보기 전에는 모르는게 일반적이다...
우리는 흔히 insert 작업을 할때 (Oracle 기준입니다.) insert into tbl_board(bno, title, content, writer) values(seq_board.nextval, #{title},#{content},#{writer}) 위와 같이 insert를 할 것이다. bno 컬럼은 sequence 객체의 값이 들어가는 자리로 VO가 있다면 vo에 저장되어 넘어가지 않고 sequence 객체의 nextval 함수를 통해서 실행될 것이다. 그런데 만약, 자동으로 추가된 PK 값을 확인해야 하는 상황이 온다면 어떻게 할까요? - sequence 객체의 currentval 함수를 이용하면 앞으로 들어갈 PK 를 확인할 수 있는데. 임의의 갯수 임의의 번째 실행이라면? 제약사항이 있다..
보통 mybatis xml 파일에 쿼리문을 작성할 때 parameterType 과 resultType을 적어 파라미터의 자료형과 반환 타입의 자료형을 적습니다. select * from tblBoard where boardSeq = #{boardSeq} 이 쿼리문의 parameterType은 Integer이고 resultType은 개발자가 직접정의한 VO 객체입니다. resultType의 VO객체의 주소를 적는 부분에 클래스 주소명이 들어가게 되는데... 저렇게 많이 들어가게 될경우 한눈에 보기 불편하고 매번 저렇게 VO에 있는 패키지 주소를 긁어와서 복붙해주어야 안전하게 될겁니다. 하지만 이런 객체타입을 return 할때 불필요하게 패키지 주소를 적지 않고도 할수 있는 방법이 있습니다.!! 바로 ali..
안녕하세요. 오늘 공유할 내용은 Spring mybatis에서 사용하는 #{} 문법과 ${} 문법의 차이와 ${}문법을 사용했을때 발생할 수 있는 SQL Injection이라는 해킹 방법에 대하여 내용을 공유하고자 합니다. 먼저 Spring이란 웹개발을 할때 기업에서 주로 사용하는 프레임워크로 전자정부 프레임워크로 지정되어 사용되는 우리나라에서 개발하는 사람들은 대부분 거쳤을 만큼 대중적인 프레임워크입니다. 그중에서 JDBC를 사용하여 DB와 연동하는 것으로 MyBatis라는 라이브러리를 사용하게 됩니다. 그중에서 VO나 DTO를 매개변수로 하여금 데이터의 이동을 하게하는데요. 그 기능으로 $와 #문법이 있습니다. 즉, VO에 name이라는 변수가 있고 getter가 getName()이라는 메소드로 되어..