728x90
pom.xml
Spring Boot에서 MyBatis와 MySQL 데이터베이스를 사용하려면 pom.xml에 관련 의존성을 추가한다.
<!-- JDBC 설정 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 드라이버 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- MyBatis 설정 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
application.properties 설정
Spring Boot 애플리케이션이 MySQL 데이터베이스와 연동될 수 있도록 DB 연결 정보를 추가.
MyBatis가 SQL 매퍼 파일을 올바르게 읽도록 매퍼 경로를 설정.
# 데이터베이스 연결 설정
spring.datasource.url=jdbc:mysql://localhost:3306/your_db
spring.datasource.username=your_username
spring.datasource.password=your_password
# MyBatis 매퍼 XML 위치 설정
mybatis.mapper-locations=classpath:/mappers/*Mapper.xml
src/main/resources →new package(mappers)→xml의mapper를 만들것.
- application.propperties 의 *Mapper.xml 란
- xml의 이름은 ~~~Mapper로 설정할 것이다.
mapper 만들기
mappers 폴더위에서
new → other → MyBatis → MyBatis XML Mapper → next → finish
생성후 xml 파일의 구성
1. <mapper>태그는 쿼리를 정의하는 태그다.
2.namespace와 인터페이스 패키지 이름과 정확하게 일치해야한다.
3.속성_ id : 사용할 메서드 명
4.속성_ resultType : 리턴타입에 대한 명시. 위치를 src/main/java 이후의 경로를 명시한다.
5.select 태그 경우 리턴타입을 명시한다.
6.insert,update,delete 태그는 리턴타입을 명시하지 않아도 되며 , 리턴이 int형으로 실행갯수를 반환한다.
<?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="mappers.MemberMapper">
</mapper>
MemberMapper.xml
(xml)
<!-- all row : selectList -->
<select id="selectList" resultType="com.example.demo02.domain.MemberDTO">
select * from member
</select>
<!-- one row : selectOne -->
<select id="selectOne" resultType="com.example.demo02.domain.MemberDTO">
select * from member where id=#{id}
</select>
<!-- row Insert : Insert -->
<insert id="insert">
insert into member values(#{id},#{password},#{name},#{age},#{jno},#{info},#{point},#{birthday},#{rid})
</insert>
<!-- row Update : Update -->
<update id="update">
update member set name=#{name}, age=#{age} ,jno=#{jno}, info=#{info}, point=#{point}, birthday=#{birthday} , rid =#{rid} where id=#{id}
</update>
<!-- row Delete : Delete -->
<delete id="delete">
delete from member where id=#{id}
</delete>
#{ } 와 ${ }의 구분
#{ }
매개변수를 안전하게 바인딩.
주로 변수값을 SQL 조건에 사용할 때 사용된다.
<select id="selectOne" resultType="com.example.demo02.domain.MemberDTO">
select * from member where id=#{id}
</select>
#{id} : parameter 로 전달된 dto 의 id 라는 컬럼의 value 가 전달됨
-> getId() 로 처리함, Map의 경우 키값이 id 인 값을 찾음.
${ }
SQL 구문에 매개변수를 직접 치환할 때 사용하며 , 컬럼이름, 테이블 등 동적 구문을 만들때 주로 사용.
SQL 인젝션에 취약할 수 있으므로 변수 값에는 사용하지 않는 것이 좋다.
<when test="searchType !=null and keyword!=null">
and ${searchType} like #{keyValue}
</when>
${searchType} : 필드를 표현 (매개변수로 전달된 객체의 id 컬럼의 값을 table의 컬럼으로 인식하고 적용함)
CDATA
XML에서는 <,>등 비교연산자의 경우 XML규칙상 에러 나기 때문에,
이 기호를 연산자로 인식하도록 하기 위해서는 SQL문을 CDATA로 묶어 주어야 한다.
<![CDATA[ SELECT * FROM table WHERE jno < 5 ]]>
MemberMapper.java
(interface)
namespace에 적었던 경로로 맞춰줘야할 interface
필요한 메서드들을 규칙화 하여 추상메서드를 만든다.
XML에 정의된 SQL 쿼리를 호출할 수 있도록 메서드 시그니처 정의.
public interface MemberMapper {
public List<MemberDTO> mSearchList(Criteria cri);
public int mSearchCount(Criteria cri);
public List<MemberDTO> mCheckList(Criteria cri);
public int mCheckCount(Criteria cri);
public List<MemberDTO> mPageList(Criteria cri);
public int totalRowsCount(Criteria cri);
public List<MemberDTO> selectList();
public MemberDTO selectOne(String id);
public int insert(MemberDTO dto);
public int update(MemberDTO dto);
public int delete(MemberDTO dto);
//public List<JoDTO> selectJoListService();
}
MemberService.java
(interface)
서비스 레이어의 인터페이스직성 . 비즈니스 로직을 정의한다.
필요한 CRUD 작업 메서드를 정의하여 , 쿼리 메서드와 유사하나 비즈니스 로직의 중심.
public interface MemberService {
List<MemberDTO> mCheckList(Criteria cri);
int mCheckCount(Criteria cri);
List<MemberDTO> mPageList(Criteria cri);
int totalRowsCount(Criteria cri);
// ** selectList
List<MemberDTO> selectList();
// ** selectOne
MemberDTO selectOne(String id);
// ** insert
int insert(MemberDTO dto);
// ** update
int update(MemberDTO dto);
// ** delete
int delete(MemberDTO dto);
// List<JoDTO> selectJoListService();
}
MemberServiceImpl.java
(class)
서비스의 구현체.
@Service 애너테이션을 통해 서비스 컴포넌트로 등록하고 , 필요한 mapper를 주입받아 메서드를 구현한다.
@Service
요청클래스와 mapper 클래스 사이 완충역할.
관련 자료
service를 나누는 이유
service 의 구현
@Service
public class MemberServiceImpl implements MemberService {
// ** 전역변수 정의
//@Autowired(required = false)
//MemberDAO dao ;
// ** Mybatis 적용
// => mapper 구현객체는 스프링이 실행시 자동으로 만들어 주입해줌.
// => 그러므로 개발자는 interface 와 xml 만 구현하고 Service 와 연결해주면 됨.
// 즉, 위 인터페이스의 구현체(클래스)는 개발자가 작성할 필요가 없음
@Autowired(required = false)
MemberMapper mapper;
//JoMapper jomapper;
Application.java
(main)
@SpringBootApplication
@MapperScan("mapperInterface")
public class Demo02Application {
public static void main(String[] args) {
SpringApplication.run(Demo02Application.class, args);
}
}
@MapperScan
Mapper를 읽을 수 있도록 도와주는 에노테이션 인터페이스패키지명을 넣어준다.
전체 흐름 요약
Member.xml ( XML ) |
MyBatis의 Mapper XML 파일로, SQL 쿼리를 정의하고 매핑하는 역할 SQL 쿼리를 직접 작성하며, SQL 쿼리를 자바 코드와 매핑하기 위한 역할을 수행 |
Member.java ( Mapper 인터페이스 ) |
Member.xml에 작성된 SQL 쿼리와 자바 메서드를 연결 실제 구현은 MyBatis가 자동으로 생성하며, 인터페이스의 메서드를 호출하면 MyBatis가 XML의 쿼리를 실행 비즈니스 로직과의 연결을 위해 서비스 레이어에서 주입 |
MemberService.java ( Service 인터페이스 ) |
비즈니스 로직을 위한 메서드 시그니처만 정의하며, 실제 구현은 MemberServiceImpl에서 이루어짐 데이터베이스 연동이 필요한 경우 MemberMapper 인터페이스의 메서드를 호출하여 필요한 로직을 구성 컨트롤러에서 직접 호출하여 데이터 처리 결과를 반환 |
MemberServiceImpl.java ( Service 구현체 ) |
컨트롤러에서 요청이 들어오면 서비스 메서드를 호출하여 비즈니스 로직을 처리한 후 데이터를 반환 트랜잭션이 필요한 경우, @Transactional 애너테이션을 추가하여 트랜잭션 처리를 할 수도 있음 |
- Controller에서 서비스 메서드 호출 → MemberService(인터페이스)로 연결
- MemberServiceImpl 구현체에서 비즈니스 로직을 처리하고 MemberMapper 호출
- MyBatis가 MemberMapper의 메서드 호출을 Member.xml의 SQL 쿼리와 연결하여 데이터베이스에서 데이터를 가져오거나 조작
- 데이터 조작 결과를 다시 서비스-컨트롤러 순으로 반환
다음에 MyBatis를 통해 동적 쿼리를 생성하기 위해 태그들을 자세히 알아보자
'Developer > Spring eGov4.0 (Java11, Tomcat9)' 카테고리의 다른 글
Spring , 스프링 프레임 워크란 ? (0) | 2024.10.29 |
---|---|
SpringBoot-MyBatis, 동적 쿼리 생성을 위한 XML 태그 끝내기 ! (0) | 2024.10.29 |
Spring , 영속 계층의 프레임 워크, myBatis와 JPA차이 , OMR이란 (2) | 2024.10.28 |
Spring , passwordEncoder (0) | 2024.10.28 |
Spring , service 의 구현 (0) | 2024.10.27 |