어떡해 일단 해야지

MyBatis — Dependency injection까지 이해하자. 본문

현대이지엘 JAVA 풀스택 개발자 아카데미 7회차

MyBatis — Dependency injection까지 이해하자.

이혜니 2026. 4. 12. 22:40

 

 

 

 

 

📌 이번 주 학습 요약

  이번 주에는 MyBatis를 중심으로 DB 연동 구조를 학습했다. 기존 JDBC의 단점인 코드 혼합 문제를 해결하며 SQL을 XML로 분리하는 방식을 이해했다. Controller → Service → DAO 구조를 통해 역할 분리와 유지보수의 중요성을 체감했다. 오늘 사담은 짧게하고 바로 본론으로 넘어가보겠다!

 


 

 

 

MyBatis

  ORM프레임 워크 (Object Relational Mapping: 객체 관계 맵핑) 자바에서 JDBC를 이용할 경우 java와 sql 언어가 한 파일에 존재해서 재사용성이 좋지 않음. MyBatis가 JDBC의 단점을 개선했다.

  • SQL 명령어를 자바 코드에서 분리하여 XML 파일에서 관리 (SQL 재사용, 효율적, 쉬움)
  • DAO는 인터페이스로 생성한다.
  • IDAO 인터페이스의 메소드 이름과 mapper.xml의 id 이름과 동일해야 한다.

pom.xml에 데이터베이스 의존성 설정이 필요하다. <dependency> 추가

  • Spring JDBC 의존성, Connection Pool 의존성, oracle의존성, mybatis/ mybatis-spring 의존성
  • jdbc.propertis 파일 생성 [driverClassName, url/username/password]
  • application-dbconfig.xml → web.xml 에 변경된 내용 설정

 

📌 SQL Mapper - MyBatis

 

  • SQL Mapper - 객체와 SQL문을 매핑
  • 내부에 JDBC 사용
  • SQL로 직접 DB 데이터 다룸
  • 복잡한 쿼리 짤 때 좋음
  • 간단한 CRUD 쿼리도 모두 작성해야 하는 단점 존재

패키지

  1. controller - @Controller
  2. model - MyBatis에서는 DAO 인터페이스(추상메소드) 필수, 구현 클래스 말고 Mapper(xml)로 생성
  3. service
    1. 인터페이스 : 모든 기능을 추상메소드로 선언(규격)
    2. 구현클래스: @Service 어노테이션

Request → Controller → Service → DAO → Mapping → Service → Controller → view

호출방법 DI 설정 : 자동 설정하도록 @Autowired 사용

DI란?

DI는 Dependency injection의 준말로 '의존성 주입' 이라는 뜻을 가진다. 소프트웨어 공학에서 말하는 의존성 주입은 하나의 객체에 다른 객체의 의존성을 제공하는 기술이라고 표현한다.


 

+ 이미지 저장법

  1. 프로젝트 내부에 저장하는 경우
    • w ebapp / resource 폴더 안에 image 폴더 생성
    • servlet-context.xml 에 맵핑 설정
  2. 프로젝트 외부에 저장하는 경우 대량의 이미지의 경우 외부 폴더에 저장하고 접근가능한 설정 필요하다.  
    • servlet-context.xml의 에 location과 mapping 이름 지정
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper DTD 선언 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- SQL Mapping -->
<mapper namespace="BoardDAO">
	<insert id="insertBoard"></insert>
	<update id="updateBoard"></update>
 	<delete id="deleteBoard"></delete>
 	<select id="getBoard" resultType="board"></select>						
 	<select id="getBoardList" resultMap="boardResult"></select>
</mapper>

 

 


 

 

이번 주를 정리하며 ✍️

  기능 구현보다 “왜 이렇게 구조를 나누는지”를 고민하게 된 한 주였다. MyBatis를 통해 코드가 정리되는 경험을 하며 설계의 중요성을 느꼈다. 앞으로는 단순 구현이 아닌, 구조까지 고려하는 개발을 목표로 해야겠다고 생각했다. 

 

 

참고

https://velog.io/@ashwon1218/DIDependency-injection-%EB%9E%80

https://velog.io/@suk13574/JDBC-vs-myBatis-vs-JPA-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%95%8C%EA%B8%B0