๐ ๊ณต๋ถํ๊ฒ ๋ ๊ณ๊ธฐ
MyBatis ์ด๊ธฐ ์ธํ ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๊ธฐ์กด JPA ์ ๋ค๋ฅด๊ฒ ์์ฑํ๋ ๋ถ๋ถ์ด ํฌ๊ฒ โ 'MyBatis ๋ ๋ฐ๋ก Entity ์ ๊ฐ๋ ์ด ์๋ค.' โก 'Repository interface ์์ JpaRepository ๋ฅผ ์์๋ฐ๋ JPA ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ @Mapper ๋ฅผ ์ด์ฉํ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค.' ์๋๋ฐ, ๊ทธ์ค์์๋ Repository ์ ์ด๋ ธํ ์ด์ ์ญํ ์ด ์ด๋ค ๊ฑด์ง ๊ถ๊ธํด์ ์ข ๋ ์์ธํ ์ ๋ฆฌ ํด๋ณด๊ธฐ๋ก ํ๋ค.
๐ ์ด๊ธฐ ์ค์ (๊ณตํต ๋ถ๋ถ)
โ ํ ์คํธ ์์ฑ
@SpringBootTest
class AppTest {
@Autowired
private AriticleService ariticleService;
@Test
@DisplayName("๊ฒ์๋ฌผ_๋ฆฌ์คํธ_๋ฐํ")
void t1() {
List<Article> articles = articleService.getArticles();
System.out.println(articles);
System.out.println(articles.get(1).getSubject());
}
}
โก Service ์์ฑ
@Service
@RequiredArgsConstructor
public class ArticleService {
private final ArticleRepository articleRepository;
public List<Article> getArticles() {
return articleRepository.getArticles();
}
}
โข DTO ํด๋์ค ์์ฑ (MyBatis ์๋ Entitiy ์ ๊ฐ๋ ์ด ๋ฐ๋ก ์์)
@Getter
public class Article {
private long id;
private String subject;
private String content;
}
โฃ DB ์์ฑ
DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE article (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
createDate DATETIME NOT NULL,
modifyDate DATETIME NOT NULL,
`subject` CHAR(100) NOT NULL,
content LONGTEXT NOT NULL
);
INSERT INTO article
SET createDate = NOW(),
modifyDate = NOW(),
`subject` = '์ ๋ชฉ1',
content = '๋ด์ฉ1';
INSERT INTO article
SET createDate = NOW(),
modifyDate = NOW(),
`subject` = '์ ๋ชฉ2',
content = '๋ด์ฉ2';
1๏ธโฃ ๋ฐฉ๋ฒ 1 : @Mapper ์ @Select ํ์ฉ
โ Repository ์์ฑ
@Mapper
public interface ArticleRepository {
@Select("""
<script>
SELECT *
FROM article
</script>
""")
List<Article> getArticles();
}
โก๏ธ @Mapper : ํด๋น interface ๋ฅผ ๋ง์ด๋ฐํฐ์ค ๋งคํผ๋ก ๋ฑ๋กํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
โก๏ธ @Select : ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผํ๋ฉด @SelectProvider ๋ฅผ ์ฌ์ฉํ๋ค.
class MemberSQL {
public static final String FIND_MEMBERS =
'''
SELECT id, name FROM MEMBER
'''
public String findMembersByName(String memberName) {
StringBuilder query = new StringBuilder();
query.append('''
SELECT id, name FROM MEMBER
''')
if (!StringUtils.isEmpty(memberName)) {
query.append("WHERE ")
query.append(QueryUtils.like("name", memberName))
}
return query.toString()
}
}
@Mapper
interface MemberMapper {
@Select(MemberSQL.FIND_MEMBERS)
public List<Member> findMembers()
@SelectProvider(type = MemberSQL.class, method = "findMembersByName")
public List<Member> findMembersByName(@Param("name") String name)
}
โก๏ธ ๋ณ๋ค๋ฅธ ์ธํ ์์ด @Mapper ์ @Select ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ฝ๊ฒ ํด๊ฒฐ๋๋ค. ์ด๋ ๊ฒ ๋๋ผ ์ ์์ง๋ง ์ด๋ ธํ ์ด์ ์ ์ญํ ์ด ๋ญ์ง ์ดํดํด๋ณด๊ธฐ ์ํด ์๋์ ๋ฐฉ๋ฒ 2 ๋ ์๋ํด๋ณด์๋ค.
2๏ธโฃ ๋ฐฉ๋ฒ 2 : @Mapper ์ xml ํ์ผ ํ์ฉ (@Select ์ฌ์ฉ x)
โ application.yml ํ์ผ์ ์ค์ ์ถ๊ฐ
# MyBatis ๊ด๋ จ ์ค์
mybatis:
mapper-locations: mybatis-mapper/*.xml
type-aliases-package: com.ay.study.mybatis_1101.app.article.dto
- mapper-locations : mapper.xml ํ์ผ ๊ฒฝ๋ก ์ง์
- type-aliases-package : mapper.xml ํ์ผ์์ package ์์ธ ๊ฒฝ๋ก ์๋ต ๊ฐ๋ฅ (ํด๋น ์ค์ ์ ํ์ฉํ๋ ค๋ฉด ๋ชจ๋ ํด๋์ค ํ์ผ์ด ํ ํด๋์ ๋ค์ด๊ฐ ์์ด์ผํ ๋ฏ!)
โฌ๏ธ

โก Mapper ์์ฑ
@Mapper
public interface ArticleMapper {
List<Article> getArticles();
}
โข xml ํ์ผ ์์ฑ (๊ฒฝ๋ก : resource/mybatis-mapper/ArticleMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ay.study.mybatis_1101.app.article.repository.ArticleMapper">
<select id="getArticles" resultType="Article">
select * from article
</select>
</mapper>
โฌ๏ธ

๐ ์๊ฐ ์ ๋ฆฌ
๋๊ฐ๋ด๋ ๋ฐฉ๋ฒ 2๏ธโฃ ๋ณด๋ค๋ ๋ฐฉ๋ฒ 1๏ธโฃ์ด ๊ฐํธํ๋ค. ์ฐพ์๋ณด๋ ์คํ๋ง์ 3.0 ๋ถํฐ Java Config ๋ฅผ ์ง์ํ๊ธฐ ์์ํ๊ณ , ์คํ๋ง ๋ถํธ๋ ๋ฌผ๋ก ์ฌ์งํ xml ์ค์ ์ ๊ฐ๋ฅํ์ง๋ง, xml ์ค์ ์์ด ๋์ ํ๋ค๊ณ ํ๋ค. ๋ง์ด๋ฐํฐ์ค ๋ํ xml ์ค์ ์์ด java ํด๋์ค๋ง์ ์ฌ์ฉํ์ฌ์, ๋์ ์ฟผ๋ฆฌ ์์ฑ์ด ๊ฐ๋ฅํ์ฌ ์คํ๋ง๋ถํธ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ด๋ผ๊ณ ํ๋ค. ์ถ๊ฐ๋ก xml ์ค์ ์์๋ MyBatis ๊ฐ ์ ๊ณตํ๋ ๋ฌธ๋ฒ์ ๋ฐ๋ผ์๋ง ์กฐ๋ฆฝ์ด ๊ฐ๋ฅํ์ง๋ง, ์คํ๋ง๋ถํธ์ ํจ๊ป ์ฌ์ฉํ๋ฉด Java ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ ๋ก์ง์ ๋ง์ถฐ ์กฐ๋ฆฝํ ์ ์๋ ์ฅ๋ฒ๋ ์กด์ฌํ๋ค๊ณ ํ๋ค. ๋ฌผ๋ก ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด xml ๊น์ง ์ ํ์๋ ์์ง๋ง, MyBatis ์ ๊ธฐ๋ณธ์ ์ธ ๋์์ ๋ํด์ ์ดํดํ๊ธฐ๋ ๋ ์ข์๋ ๊ฒ ๊ฐ๋ค.
๐ ์ฐธ๊ณ
โ mapper ์ด๋ ธํ ์ด์ ์ ํตํ springboot, mybatis ์ธํ ํ๊ธฐ : https://frozenpond.tistory.com/85
[spring] mapper ์ด๋ ธํ ์ด์ ์ ํตํ springboot, mybatis ์ธํ ํ๊ธฐ
spring boot๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑ, Mybatis ์ฐ๋ํ๋ ์์ ์ ๋๋ค. ์คํ๋ง์์ mybatis๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ SqlSession, SqlSessionTemplate์ ์ค์ ํ๊ณ selectOne(maper๋ค์์คํ์ด์ค.id, parameter) ๋ฑ์ ๋ฉ์๋๋ฅผ ํต..
frozenpond.tistory.com
โก Mapper, Repository ์ญํ ๋ฐ ๊ฐ๋จํ ์์ : https://ddacker.tistory.com/13
[SI์์ ์ด์๋จ๊ธฐ] ๋ด๋ง๋๋ก Mapper,Repostiory ์ญํ ๋ฐ ๊ฐ๋จํ ์์
๋ฐฑ์๋ ๋น์ฆ๋์ค ๋ก์ง ์ ์ฒด ๊ตฌ์กฐ Model: controller, Service, Mapper/Repository ์์ ์ํธ ์์ฉ RestController : Service์ ์ํธ์์ฉ Service: Mapper, Reopstiory์ ์ํธ์์ฉ Mapper/Reopstiory: SqlSesion ๋ฐ..
ddacker.tistory.com
โข ๋ง์ด๋ฐํฐ์ค ๋์ ์ฟผ๋ฆฌ Java ๋ก ๋ง๋ค๊ธฐ (@Select ๊ด๋ จ ๋ด์ฉ ๋ณผ ์ ์์ & ์ถ์ฒ!) : https://jason-moon.tistory.com/130
๋ง์ด๋ฐํฐ์ค(MyBatis) ๋์ ์ฟผ๋ฆฌ Java๋ก ๋ง๋ค๊ธฐ.
์คํ๋ง์ 3.0 ๋ถํฐ Java Config๋ฅผ ์ง์ํ๊ธฐ ์์ํ๊ณ , ์คํ๋ง ๋ถํธ๋ XML ์ค์ ์์ด ๋์ ํ๋ค. (๋ฌผ๋ก ์ฌ์ ํ XML ์ค์ ์ ๊ฐ๋ฅํ๋ค.) ๋ง์ด๋ฐํฐ์ค ๋ํ, XML ์ค์ ์์ด Java ํด๋์ค๋ง์ ์ฌ์ฉํ์ฌ์, ๋์ ์ฟผ
jason-moon.tistory.com