ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [포스코x코딩온] MyBatis 사용(with h2)
    [포스코x코딩온] 웹개발자 풀스택 부트캠프8기 2023. 11. 2. 20:58
    728x90

    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 사용하기

     

     

    개발 진행 순서 (괄호 안은 폴더명(변경해서 사용하기))

     

    1. DB 생성 (schema.sql) 
    2. Domain(domain.Users.java) 생성 
    3. 보안을 위해 DTO (dto.UsersDTO.java) 생성
    4. application.properites 설정
    5. resources/mybatis-mapper 생성
    6. application.properties 설정
    7. xml 파일 생성(mybatis-mapper.UsersMapper.xml)
    8. 인터페이스 생성(UserMapper.interface)
    9. 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
Designed by Tistory.