Legday
[Spring] MyBatis 초기설정 후 데이터 읽어보기 본문
MyBatis는 자바 퍼시스턴스 프레임워크의 하나로 XML에 SQL문을 작성하여 자바오브젝트와 연결시켜줍니다
https://github.com/jadev7/MyBatisSetting/tree/master
GitHub - jadev7/MyBatisSetting
Contribute to jadev7/MyBatisSetting development by creating an account on GitHub.
github.com
- 위 링크로 들어가서 초기설정 파일을 받아서 STS툴에 적용시키면 됩니다.
1) 기본 구조 살펴보기
- MyBatisConfig.java에서는 MyBatis를 사용하기 위한 기본 세팅이 필요합니다.
- users.xml 은 MyBatisConfig.java파일에서 세팅한 내용을 바탕으로 SQL쿼리문을 작성하여 자바 오브젝트와 연결 시켜주는 파일입니다.
- application.properties에서는 OracleDB연동을 합니다.

2) MyBatisConfig.java
- @MapperScan 어노테이션은 basePackages에 지정된 경로에있는 인터페이스를 IoC컨테이너에 띄우는 역할을 합니다.
- 그리고 코드 아래쪽에 getResources() 메서드 안에있는 경로가 mapper패키지안에 xml파일을 전부 가져오는 역할을 합니다.
- config파일에서는 위에말한 2가지만 신경써주면 됩니다.
package site.metacoding.MyBatisSetting.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = "site.metacoding.MyBatisSetting.domain")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
3) users.xml
- 실제 DB데이터를 쓸 SQL 쿼리문을 XML파일에 적어서 자바 오브젝트에 연결을 시켜줍니다.
- 이때 XML파일 위치도 config파일에서 설정했떤 mapper/*.xml 과 맞춰줘야 하기때문에

- 아래 코드에서는 MyBatis문법을 사용하는데 우선 <mapper ></mapper> 태그안에 sql문을 적어줍니다.
- mapper태그안에 옵션은 namespace가 있는데 namespace는 실제 db에 접근할 DAO가있는 위치를 적어줍니다.
- 그리고 사용할 SQL문을 적어주면 되는데 이때 자바 오브젝트에서 받아올 데이터는 JSP EL표현식을 써줍니다. #{매핑데이터명}
<?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="site.metacoding.MyBatisSetting.domain.users.UsersDao">
<insert id="insert">
INSERT INTO users(id, username, password, email, createdAt)
VALUES(users_seq.nextval, #{username}, #{password}, #{email}, sysdate)
</insert>
<select id="findById" resultType="site.metacoding.MyBatisSetting.domain.users.Users">
SELECT * FROM users WHERE id = #{id}
</select>
<select id="findAll" resultType="site.metacoding.MyBatisSetting.domain.users.Users">
SELECT * FROM users ORDER BY id DESC
</select>
<update id="update">
UPDATE users SET
username=#{username},
password=#{password},
email=#{email}
WHERE id=#{id}
</update>
<delete id="delete">
DELETE FROM users WHERE id=#{id}
</delete>
</mapper>
4) Entity와 controller작성
- 먼저 domain패키지 안에 Users 엔티티와 DAO를 만들겠습니다.(간단하게 데이터검색만 구현하겠습니다.)
- 이때 DAO는 users.xml과 매핑해야 하기 때문에 인터페이스로 생성합니다.

소스코드
- DAO는 인터페이스로 하고 데이터검색만 구현하기 때문에 findAll()이란 메서드를 작성해줍니다.
package site.metacoding.MyBatisSetting.domain.users;
import java.util.List;
public interface UsersDao {
public List<Users> findAll();
}
- 실제 Users테이블에 있는 속성들과 똑같은 이름으로 선언.
package site.metacoding.MyBatisSetting.domain.users;
import java.sql.Timestamp;
public class Users {
private Integer id;
private String username;
private String password;
private String email;
private Timestamp createdAt;
}
- Timestamp 클래스는 2가지가 있는데 반드시 java.sql로 import하자

- 다음으로 Client에게 잘 통신이 돼었는지 보여줄 코드와 메시지 그리고 실제 body값을 출력해야한다.
- Client와 통신하기 때문에 web패키지안, 그리고 DTO(DataTransferObject)를 만들어 dto를 Client에게 반환 한다(http코드를 보내줄 수 있지만 연습이기 때문에 dto를 임의로 만들어 통신한다)

- 실제 반환할 BODY값은 객체가 들어올 수 있고 String이 들어올 수 있기 때문에 컬렉션을 이용하여 동적으로 바꿔주자.
package site.metacoding.MyBatisSetting.web.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class RespDto<T> {
private Integer code; // 잘 통신이 되면 1 , 에러는 -1
private String msg; //Client에게 전달한 메시지
private T body; // 실제 데이터값
}
- 이제 web패키지에 controller작성.(Client와 통신하는 부분은 web패키지, DB와 통신하는 패키지는 domain으로 쓰는게 바람직함)
- 데이터만 출력하므로 @RestController 어노테이션을 써서 IoC컨테이너에 UsersController를 띄우고
- UsersDao를 주입을 해줍니다. 이때 final을 안쓴다면 UsersController생성자를 생성하여 생성자 주입을 해줘야하지만 final을 쓰고 클래스위에 @RequiredArgsConstructor을 기입하면 DS(Dispatcher Servlet)이 자동으로 생성해줍니다.( 이 방법이 코드가 깔끔해 집니다)
- 그리고 데이터만 read하기 때문에 GET통신을하고 매핑주소는 /users
- Client에게 DB데이터를 통신하기 때문에 아까만든 DTO객체로 반환!
package site.metacoding.MyBatisSetting.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import site.metacoding.MyBatisSetting.domain.users.UsersDao;
import site.metacoding.MyBatisSetting.web.dto.RespDto;
@RequiredArgsConstructor
@RestController
public class UsersController {
private final UsersDao usersDao;
@GetMapping("/users")
public RespDto<?> FindAll(){
return new RespDto<>(1,"모든정보출력",usersDao.findAll());
}
}
5) 구현화면
- 데이터가 안뜬다면 SQL Developer에서 미리 데이터를 insert하시면 됩니다. 글 맨위에 주소에 readme.md 파일에 적혀있습니다.

'Spring&Springboot > Spring(개인공부용)' 카테고리의 다른 글
| [Spring]아이디 저장기능(Cookie값 이용) (0) | 2022.09.16 |
|---|---|
| [Spring] MariaDB 세팅하기 (0) | 2022.09.13 |
| [Spring]H2 데이터베이스란 ? (0) | 2022.08.31 |
| [JSTL]템플릿 엔진 문법 (0) | 2022.08.31 |
| [Spring]DS(Dispatcher Servlet) 동적으로 구현해보기 (0) | 2022.08.30 |