[MyBatis / JPA] MyBatis์™€ JPA

DevelopHeoยท2025๋…„ 1์›” 4์ผ
post-thumbnail

๐Ÿ“™ MyBatis์™€ JPA ์ฐจ์ด

MyBatis์™€ JPA๋Š” ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Java ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์ด์ง€๋งŒ, ๊ฐ๊ฐ์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํŠน์ง•์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

โœ๏ธ 1. ๊ฐœ๋…

  • MyBatis

    • SQL ๋งคํผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  XML ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐœ๋ฐœ์ž๊ฐ€ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • JPA (Java Persistence API)

    • ORM(Object Relational Mapping) ๊ธฐ์ˆ ๋กœ, ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐ์ฒด ๊ธฐ๋ฐ˜์˜ ์ž‘์—…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ 2. ์ฝ”๋“œ ์ž‘์„ฑ

MyBatis

  • SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ ์‹œ XML ํŒŒ์ผ์ด๋‚˜ Mapper ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ˆ˜์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
//xml
<!-- MyBatis XML Mapper -->
<select id="selectUserById" resultType="User">
  SELECT * FROM user WHERE id = #{id}
</select>
//java
// Mapper ์ธํ„ฐํŽ˜์ด์Šค
public interface UserMapper {
    User selectUserById(int id);
}

JPA

  • ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ, ์ฟผ๋ฆฌ๋Š” JPQL(Java Persistence Query Language) ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ช…๋ช… ๊ทœ์น™์„ ํ†ตํ•ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” @Query ์–ด๋…ธํ…Œ์ด์…˜์ด๋‚˜ Criteria API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
// ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

// JPA Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findById(Long id);
}

โœ๏ธ 3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…์†์„ฑ

MyBatis

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กด์ ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด SQL ์ˆ˜์ •์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠนํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

JPA

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์ ์ธ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ตœ์ ํ™”๋œ ์ž‘์—…์€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Hibernate ๊ฐ™์€ ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ 4. ํ•™์Šต ๊ณก์„ 

MyBatis

  • SQL์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋น„๊ต์  ์‰ฝ๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ๋ช…์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

JPA

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•™์Šต ๊ณก์„ ์ด ๋‹ค์†Œ ๋†’์Šต๋‹ˆ๋‹ค.
  • ๋™์ž‘ ๋ฐฉ์‹(์บ์‹ฑ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ, Lazy/Eager ๋กœ๋”ฉ ๋“ฑ)์„ ๊นŠ์ด ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ 5. ์„ฑ๋Šฅ

MyBatis

  • ์ง์ ‘ ์ž‘์„ฑํ•œ SQL์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

JPA

  • ORM ๊ธฐ์ˆ ๋กœ ์ธํ•ด ์ดˆ๊ธฐ ์„ค์ •์ด๋‚˜ ๋ณต์žกํ•œ ๋งคํ•‘์—์„œ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์บ์‹ฑ, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋“ฑ์„ ํ†ตํ•ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธ 6. ์ฃผ์š” ํŠน์ง• ์š”์•ฝ

ํŠน์ง•MyBatisJPA
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธSQL ์ค‘์‹ฌ๊ฐ์ฒด ์ค‘์‹ฌ
์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐฉ์‹์ง์ ‘ SQL ์ž‘์„ฑJPQL, ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜, ๋˜๋Š” Criteria API
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜์กด์„ฑ๋†’์Œ๋‚ฎ์Œ
ํ•™์Šต ๊ณก์„ ๋‚ฎ์Œ๋†’์Œ
์œ ์—ฐ์„ฑSQL ์ž‘์„ฑ์— ์œ ๋ฆฌ๊ฐ์ฒด ์ค‘์‹ฌ ์ž‘์—…์— ์œ ๋ฆฌ
์ž๋™ํ™” ์ˆ˜์ค€๋‚ฎ์Œ๋†’์Œ

โœ๏ธ ๊ทธ๋ž˜์„œ ๋ญ ์จ์•ผํ•ด??

MyBatis

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํŠนํ™”๋œ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ๊ณ , SQL ์ž‘์„ฑ์ด ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ ์ ํ•ฉ.
  • ๋น ๋ฅธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ.

JPA

  • ๊ฐ์ฒด ์ค‘์‹ฌ ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ ํ•ฉ.
  • ์ž๋™ํ™”๋œ CRUD ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๊ณ , ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ค‘์‹œํ•˜๋Š” ๊ฒฝ์šฐ.

0๊ฐœ์˜ ๋Œ“๊ธ€