
MyBatis 는 자바 퍼시스턴스 프레임워크의 하나이다.
퍼시스턴스(Persitence) : 애플리케이션을 종료 후 실행 시 이전에 저장한 데이터를 다시 불러 올 수 있는 기술DAO를 따로 해두면 작업도 많이 필요하지만 자잘한 실수도 생기게 된다.
그래서 만들어진게 MyBatis 이다.
1) pom.xml
2) Mapper
✔ application.properties 에 DB 연결은 위한 내용과 mapper 경로를 설정한다.
# jsp
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
# db connection infomation
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/mydb
spring.datasource.username=web_user
spring.datasource.password=pass
# mapper(sql) location
mybatis.mapper-locations=mapper/*_mapper.xml
→ * 의 경우 어떠한 이름도 가능하다는 의미이다.
src/main/resources 폴더에 mapper 이라는 폴더를 만들어주면 된다.mapper 폴더에는 other → xml → xml file 에 들어가서 (서비스에 대한 이름)_mapper.xml 파일을 만들어주면 된다.✔ *_mapper.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="ko.co.gudi.dao.MemberDAO"> // 인터페이스
<insert id="join" parameterType="map"> // 추상 메서드
INSERT INTO member(id,pw,name,age,gender,email)
VALUES(#{id},#{pw},#{name},#{age},#{gender},#{email});
</insert>
<select id="login" resultType="String">
SELECT id FROM member WHERE id = #{param1} AND pw = #{param2}
</select>
<select id="list" resultType="kr.co.gudi.dto.MemberDTO">
SELECT id, name, age FROM member
</select>
<delete id="del">
DELETE FROM member WHERE id = #{param1}
</delete>
</mapper>
<mapper namespace=""> : 해당 xml 과 연결될 interface 경로 작성 (공백, 오타 주의❌)<insert id="join" parameterType="map"> 쿼리문 작성 </insert>id="" : 해당 인터페이스에 어떤 추상 메서드와 연결되어 있는지 (메서드 이름 작성)parameterType="" : 값을 가져올 때 어떤 형태로 가져오는지 명시#{이름} 으로 작성해줘야 한다.<select id="login" resultType="String"> 쿼리문 </select>
→ resultType : 꺼내올 데이터 타입을 작성
→ ? 를 처리해주기 위해 #{param1} 을 작성해준다. (param 뒤에 숫자는 들어오는 파라미터의 개수, 순서에 맞춰 작성해준다.)
<select id="list" resultType="kr.co.gudi.dto.MemberDTO">쿼리문 </select>
→ DTO를 적을 경우 DTO의 풀 패키지 경로를 적어줘야 한다. (여러개의 값을 계속 가져오기 때문에 DTO 활용)
→ DTO 형태의 list로 받기로 선언해두었기 때문에 알아서 가져올 것이다.
<delete id="del">쿼리문</delete>✔ DAO 를 interface로 선언해 연결
이렇게 설정을 완료하더라도 xml 은 java 파일이 아니기 때문에 이 둘을 연결하기 위한 작업이 필요하다.
우리가 하나하나 연결하는 것은 매우 어렵기 때문에 우리는 interface를 활용해줘야 한다.
이제부터는 DAO가 그러한 interface의 역할을 수행할 것이다.
DAO가 interface의 역할을 수행하기 위해서는 @Mapper 어노테이션을 클래스 위에 선언해줘야 한다.
interface : 어려운 일을 쉽게 할 수 있도록 규격을 맞춰주는 것
@Mapper
public interface MemberDAO {
int join(Map<String, String> param);
}
✨ 결과
이렇게 xml 파일을 추가로 설정해주면 이제는 DAO에서 DB연결, 자원반납 등을 할 필요가 없이 xml이 Connection, PreparedStatement, ResultSet, 자원반납 등을 모두 알아서 해주게 된다.
우리는 지금까지 controller에서 service를 사용하기 위해 객체를 생성했었다.
하지만 서비스가 10개라고 하면 클래스를 10개를 복사하고 그거를 5명만 이용한다고 해도 객체가 50개가 생기게 된다.
그래서 java에서는 메모리 낭비를 방지하기 위해 싱클톤 패턴 을 지원해준다.
📌 싱클톤 패턴 : 객체를 복사해서 공통영역(static) 에 저장하는 방식
하나의 복사본(클래스를 만들 때 복사본을 만든다.)을 만들어서 그 복사된 클래스를 공통적으로 사용해주는 것이다.
@Autowired MemberService service;
❗ 서비스를 받아올 때는 service 클래스에 @Service 어노테이션이 있어야 가능하다.
🔽 예시
controller
@Controller
public class MemberController {
@Autowired MemberService service;
}
service
@Service
public class MemberService {
@Autowired MemberDAO dao;
}
DAO
@Mapper
public interface MemberDAO {
}
1) 제어 역행(I.O.C : Inversion Of Control) 지원 하여 필요에 따라 스프링이 사용자 코드를 호출
@Autowired : 내가 객체생성하라고 안했는데 알아서 생성하고, executeUpdate() 내가 실행하라고 안해도 알아서 실행하는 등.. 2) 의존성 주입(D.I : Dependency Injection) 을 지원하여 느슨한 결합을 유지
3) Spring Framework 에서 객체 자원을 효율적으로 관리 해 준다.
4) AOP(Aspect Orient Programming) 을 지원 한다.