You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
마이바티스 스프링 연동 모듈이 만들어주는 ItemMapper 의 구현체 덕분에 인터페이스 만으로 편리하게 XML 의 데이터를 찾아서 호출할 수 있다.
원래 마이바티스를 사용하려면 더 번잡한 코드를 거쳐야 하는데, 이런 부분을 인터페이스 하나로 매우 깔끔하고 편리하게 사용할 수 있다.
매퍼 구현체는 예외 변환까지 처리해준다. MyBatis에서 발생한 예외를 스프링 예외 추상화인 DataAccessException 에 맞게 변환해서 반환해준다. JdbcTemplate이 제공하는 예외 변환 기능을 여기서 도 제공한다고 이해하면 된다.
일부러 SQL 구문을 틀리게하면 BadSqlGrammerException 이 터지는것 확인 가능 (스프링 예외)
정리
매퍼 구현체 덕분에 마이바티스를 스프링에 편리하게 통합해서 사용할 수 있다.
매퍼 구현체를 사용하면 스프링 예외 추상화도 함께 적용된다.
마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기 능도 마이바티스와 함께 연동하고, 동기화해준다.
MyBatis 기능 정리1 - 동적 쿼리
MyBatis에서 자주 사용하는 주요 기능을 공식 메뉴얼이 제공하는 예제를 통해 간단히 정리해보자.
if 는 조건에 따라 값을 추가할지 말지 판단. 내부 문법은 OGNL 을 사용. 객체 인스턴스 호출해서 거기있는 로직 호출도 가능?
<selectid="findActiveBlogWithTitleLike"resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<iftest="title != null">
AND title like #{title}
</if>
</select>
choose, when, otherwise
자바의 switch 와 유사
<selectid="findActiveBlogLike"resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<whentest="title != null">
AND title like #{title}
</when>
<whentest="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
trim, where, set
if 를 그냥 사용하면 where 나 and 구문이 원하지 않게 등장하게된다.
```xml
<selectid="findActiveBlogLike"resultType="Blog">
SELECT * FROM BLOG
WHERE
<iftest="state != null">
state = #{state}
</if>
<iftest="title != null">
AND title like #{title}
</if>
<iftest="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
사용하면 해결 가능
<selectid="findActiveBlogLike"resultType="Blog">
SELECT * FROM BLOG
<where>
<iftest="state != null">
state = #{state}
</if>
<iftest="title != null">
AND title like #{title}
</if>
<iftest="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
<where> 는 문장이 없으면 where 를 추가하지 않는다. 문장이 있으면 where 를 추가한다. 만약 and 가 먼저 시작 된다면 and 를 지운다.
참고로 다음과 같이 trim 이라는 기능으로 사용해도 된다. 이렇게 정의하면 <where> 와 같은 기능을 수행한다.
<selectid="selectPostIn"resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreachitem="item"index="index"collection="list"open="ID in ("separator=","close=")"nullable="true">
#{item}
</foreach>
</where>
</select>
컬렉션을 반복 처리할 때 사용한다. where in (1,2,3,4,5,6) 와 같은 문장을 쉽게 완성할 수 있다.
파라미터로 List 를 전달하면 된다.
MyBatis 기능 정리2 - 기타 기능
애노테이션으로 SQL 작성 가능
@Select("select id, item_name, price, quantity from item where id=#{id}")
Optional<Item> findById(Longid);
XML (ItemMapper) 에 이미 구현되어 있으면 중복 오류 발생함. 둘 중 하나만 있어야함.
근데 사실 마이바티스는 XML 기능을 때문에 사용해서 이 기능 별로 사용하지 않음. (동적 쿼리는 구현 불가)
문자열 대체 #{} 문법은 ?를 넣고 파라미터를 바인딩하는 PreparedStatement 를 사용한다.
때로는 파라미터 바인딩이 아니라 문자 그대로를 처리하고 싶은 경우도 있다. 이때는 ${} 를 사용하면 된다.
@Select("select * from user where ${column} = #{value}") // column 은 ? 로 파라미터 바인딩 불가한 위치임.UserfindByColumn(@Param("column") Stringcolumn, @Param("value") Stringvalue);
주의 ${} 를 사용하면 SQL 인젝션 공격을 당할 수 있다. 따라서 가급적 사용하면 안된다. 사용하더라도 매우 주의깊게 사용
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
MyBatis 적용2 - 설정과 실행
맵퍼만 만들었고, 리포지토리를 아직 안만들었으니 만들자.
@Mapper 라고 해두면 마이바티스 스프링 모듈에서 해당 인터페이스 자동으로 인식해 구현채를 뭔가 만들어냄. (이름 읽어서 XML 호출)
그리고 스프링 빈에 등록해줌. 그래서 이를 주입받을 수 있다.
컨피그 만들기
마이바티스 모듈이 데이터소스나 트랜잭션 메니져 다 읽어서 Mapper 랑 연결시킴.
그래서 데이터소스 따로 넣어주지 않아도 된다.
MyBatis 적용3 - 분석
ItemMapper 구현체 관련설명!
인터페이스는 스프링 빈에 등록될 수 없음.
그럼 어떻게 ItemMapper 가 등록되었지?
마이바티스 스프링 연동 모듈에서 처리해줌
해당 구현체는 이럴땐 어떤 코드를 수행해야 한다는 로직이 짜여져 있는데 @Mapper 객체에 붙임.
이를 확인 하는 방법.
리포지토리에 로그 남기기
실행 결과
출력해보면 JDK 동적 프록시가 적용된 것을 확인할 수 있다.
매퍼 구현체
ItemMapper의 구현체 덕분에 인터페이스 만으로 편리하게 XML 의 데이터를 찾아서 호출할 수 있다.DataAccessException에 맞게 변환해서 반환해준다. JdbcTemplate이 제공하는 예외 변환 기능을 여기서 도 제공한다고 이해하면 된다.일부러 SQL 구문을 틀리게하면 BadSqlGrammerException 이 터지는것 확인 가능 (스프링 예외)
정리
매퍼 구현체 덕분에 마이바티스를 스프링에 편리하게 통합해서 사용할 수 있다.
매퍼 구현체를 사용하면 스프링 예외 추상화도 함께 적용된다.
마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기 능도 마이바티스와 함께 연동하고, 동기화해준다.
MyBatis 기능 정리1 - 동적 쿼리
MyBatis에서 자주 사용하는 주요 기능을 공식 메뉴얼이 제공하는 예제를 통해 간단히 정리해보자.
동적 SQL
if 는 조건에 따라 값을 추가할지 말지 판단. 내부 문법은 OGNL 을 사용. 객체 인스턴스 호출해서 거기있는 로직 호출도 가능?
choose, when, otherwise
자바의 switch 와 유사
trim, where, set
if 를 그냥 사용하면 where 나 and 구문이 원하지 않게 등장하게된다.
사용하면 해결 가능
<where>는 문장이 없으면where를 추가하지 않는다. 문장이 있으면where를 추가한다. 만약and가 먼저 시작 된다면and를 지운다.참고로 다음과 같이
trim이라는 기능으로 사용해도 된다. 이렇게 정의하면<where>와 같은 기능을 수행한다.foreach
where in (1,2,3,4,5,6)와 같은 문장을 쉽게 완성할 수 있다.List를 전달하면 된다.MyBatis 기능 정리2 - 기타 기능
XML (ItemMapper) 에 이미 구현되어 있으면 중복 오류 발생함. 둘 중 하나만 있어야함.
근데 사실 마이바티스는 XML 기능을 때문에 사용해서 이 기능 별로 사용하지 않음. (동적 쿼리는 구현 불가)
#{}문법은 ?를 넣고 파라미터를 바인딩하는PreparedStatement를 사용한다.때로는 파라미터 바인딩이 아니라 문자 그대로를 처리하고 싶은 경우도 있다. 이때는
${}를 사용하면 된다.주의
${}를 사용하면 SQL 인젝션 공격을 당할 수 있다. 따라서 가급적 사용하면 안된다. 사용하더라도 매우 주의깊게 사용SQL 코드 재사용 가능.
즉 중복되는 부분 조각화 해서 재사용 가능.
<include>를 통해서<sql>조각을 찾아서 사용할 수 있다.마치 파라미터로 넘겨서 조각을 사용 가능
결과를 매핑할 때 테이블은
user_id이지만 객체는id이다.이 경우 컬럼명과 객체의 프로퍼티 명이 다르다. 그러면 다음과 같이 별칭(
as)을 사용하면 된다.별칭을 사용하지 않고도 문제를 해결할 수 있는데, 다음과 같이
resultMap을 선언해서 사용하면 된다.마이바티스도 복잡한 객체 연관관계를 고려한 데이터 조회 가능.
이때는
<association>,<collection>등을 사용한다.JPA 에선 ORM 으로 매핑해서 자연스럽게 가능한데, 마이바티스는 공수도 많이 들고 성능을 최적화 하기 어렵다.
All reactions