-
[포스코x코딩온] MyBatis 사용(with h2)[포스코x코딩온] 웹개발자 풀스택 부트캠프8기 2023. 11. 2. 20:58728x90
MyBatis
https://mybatis.org/mybatis-3/ko/index.html
MyBatis – 마이바티스 3 | 소개
마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와
mybatis.org
- SQL Mapper 로써, JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해 준다.
- 객체 지향 언어인 자바와 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있도록 도와주는 프레임워크
특징
- 쉬운 접근성과 코드의 간결함
- JDBC의 모든 기능을 MyBatis에서 사용 가능
- 복잡한 JDBC 코드를 걷어내 깔끔한 소스코드 유지 가능
- SQL 문과 프로그래밍 코드의 분리
- SQL 문과 프로그래밍 코드가 분리되어 있어 SQL에 변경이 있을 때 다시 컴파일 할 필요가 없다,
- 다양한 프로그래밍 언어로 구현 가능
- Java, C#, .NET, Ruby
h2를 활용하여 Mybatis 사용하기
개발 진행 순서 (괄호 안은 폴더명(변경해서 사용하기))
- DB 생성 (schema.sql)
- Domain(domain.Users.java) 생성
- 보안을 위해 DTO (dto.UsersDTO.java) 생성
- application.properites 설정
- resources/mybatis-mapper 생성
- application.properties 설정
- xml 파일 생성(mybatis-mapper.UsersMapper.xml)
- 인터페이스 생성(UserMapper.interface)
- controller 생성(controller.UsersController)
제가 생각한 흐름도 입니다. 파일 구조
코드를 보면서 진행해 보겠습니다.
1. DB 생성(schema.sql)
create table users ( id bigint not null auto_increment, name varchar(255) not null, address varchar(255) not null, primary key(id) );
- users 테이블에 id, name, address을 생성해 줍니다.
2. Domain(domain.Users.java) 생성
package com.mybatis.testmybatis.domain; public class Users { private long id; private String name; private String address; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
- DB를 사용하기 위하여 매핑된 Domain을 만들어줍니다.
- getter, setter를 만들어 줌으로써 데이터를 지정하고 불러올 수 있습니다.
3. 보안을 위한 DTO(dto.UsersDTO.java) 생성
package com.mybatis.testmybatis.dto; public class UsersDTO { private long id; private String name; private String address; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
4. application,properties 설정
- 런타임 시 다양한 환경에서 동작할 수 있도록 필요한 옵션들을 제공하는 데 사용되는 파일
spring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:mybatisserverdb mybatis.type-aliases-package=com.mybatis.testmybatis.domain mybatis.mapper-locations=mybatis-mapper/*.xml
5. mybatis-mapper.UsersMapper.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"> <!--xml은 직접적으로 사용할 수 없어서 interface를 만들어서 사용한다. namespace를 이용하여 UserMapper에 접근--> <mapper namespace="com.mybatis.testmybatis.mapper.UserMapper"> <!-- UserMapper에 있는 findAll을 받아와서 resulType에 있는곳에서 찾아서 반환하겠다.--> <select id="findAll" resultType="com.mybatis.testmybatis.domain.Users"> SELECT * FROM users </select> </mapper>
6. 인터페이스 생성(UserMapper.interface)
package com.mybatis.testmybatis.mapper; import com.mybatis.testmybatis.domain.Users; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { //xml 참고하여 사용 List<Users> findAll(); //xml 참고 안하기 //insertUser에 user가 들어오면 @Insert가 실행된다. @Insert("INSERT INTO users (name, address) VALUES(#{name}, #{address})") void insertUser(Users user); }
7. Controller 설정 ( controller.UsersController)
package com.mybatis.testmybatis.controller; import com.mybatis.testmybatis.domain.Users; import com.mybatis.testmybatis.dto.UsersDTO; import com.mybatis.testmybatis.service.UsersService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @Controller public class UsersController { @Autowired //UsersService를 다 가져와서 쓸 수 있다.(자동으로 주입 시켜줌)(new, 상속 등을 안써도 됨) private UsersService usersService; @GetMapping("/users") public String getUsers(Model model){ List<UsersDTO> userlist = usersService.getUsersList(); model.addAttribute("list",userlist); return "user"; } @GetMapping("/insert") public String getInsertUser(@RequestParam String name, @RequestParam String address ,Model model){ Users user = new Users(); user.setName(name); user.setAddress(address); usersService.addUser(user); model.addAttribute("list",null); return "user"; } } /** * @Autowired * 이 어노테이션을 사용하면 Spring 컨테이너가 자동으로 해당 타입의 Bean을 필드나 메서드에 주입 * 1. 핃드 주입: Spring이 자동으로 필드에 주입 * 장점: 코드가 간결해진다. 단점: 의존성을 변경시키거나 테스트에 어려움이 생길 수 있다. * * 2. 생성자 주입: Spring이 생성자의 파라미터 타입에 맞는 빈을 찾아 주입 * - 불변성을 보장(객체의 상태가 생성된 후 변경되지 않음) * * @Autowired vs new * 공통점: 객체를 생성하고 참조하는데 사용 * 차이점: * - @Autowired: Spring의 IoC 컨테이너를 통해 의존성 주입 * - new: 개발자가 명시적으로 객체를 생성 * * * */
실행 결과
- localhost:8080/inser?name=홍길동&address=서울시마포구
- h2 확인 결과
- localhost:8080/users
MyBatis 동작 원리
- 애플리케이션 시작 시 SqlSessionFactoryBuilder가 설정 파일을 참고해 SqlSessionFactory 생성
- SqlSessionFactory: 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 중요한 객체
- DB 작업 시 SqlSessionFactory가 SqlSession 생성
- SqlSession : Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 Return 해주는 객체
- 생성된 SqlSession을 참고해 mapper 인터페이스 호출
- Mapper가 SqlSession을 호출해 SQL 실행 후 결과 Return
728x90'[포스코x코딩온] 웹개발자 풀스택 부트캠프8기' 카테고리의 다른 글
[포스코x코딩온] Mybatis를 활용한 게시판 기능 구현(with lombok) (1) 2023.11.09 Mybatis를 활용한 CRUD 구현(회원가입, 로그인, 수정, 삭제) (1) 2023.11.04 [포스코x코딩온] JDBC와 SQL Mapper 개념(Spring Database) (0) 2023.11.01 [포스코x코딩온] API 만들기(Get, Post, Axios 사용법) (2) 2023.11.01 [포스코x코딩온] REST, RESTAPI, DTO, VO (SpringBoot) (0) 2023.10.31