베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 운영체제
    • 함수형인터페이스
    • dfs
    • C++
    • 스프링시큐리티
    • 스프링
    • 알고리즘
    • 토비스프링
    • 이펙티브자바
    • 백준
    • 스레드
    • jpa
    • leetcode
    • BFS
    • Spring
    • java
    • 자바8
    • 자바
    • 코드업
    • 데이터베이스

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    MyBatis, MySql, Spring Boot를 이용한 간단 예제
    Spring/실습

    MyBatis, MySql, Spring Boot를 이용한 간단 예제

    2022. 6. 7. 19:24

    [도입]

    자바에서는 데이터베이스를 이용하기 위해 JDBC API를 이용하는데, 개발자가 작성해야 하는 코드가 너무 많아 불편했다. 이런 JDBC를 사용하기 쉽게 SQL Mapper를 이용한 MyBatis의 간단 예제를 살펴보자.

     

    [MyBatis 동작 원리]

    MyBatis 동작 구조

    1. 애플리케이션이 시작되면 SqlSessionFactoryBuilder는 MyBatis 설정 파일을 참고해서 SqlSessionFactory를 생성한다.

    2. 애플리케이션에서 Sql 요청이 들어오면 SqlSession을 생성한다.

    3. 생성한 SqlSession는 수행하는 쿼리문이 담겨져 있는 mapper를 참고하여 DB작업을 수행한다. 

     

    [Mapper Interface]

       MyBatis 3.0이전에는 xml파일에 쿼리 명령문을 작성했어야 했는데, 3.0이후부터는 Mapper Interface를 사용하여 간단하게 쿼리문 작성이 가능해졌다. 

    @Mapper
    public interface userMapper {}

     

    Mapper인터페이스를 호출하면, SqlSession 메서드 호출을 통해 SQL 처리를 요청한다. 

    @Mapper 어노테이션을 통해 스프링부트가 해당 클래스를 Mapper로 인식할 수 있으며 해당 interface를 MyBatis mapper 빈으로 등록한다.

     

    MyBatis & Spring Boot 예제

    프로젝트 설정

    start.spring.io 사이트에 접속하여 다음 dependency를 추가해준다.

    1. spring web
    2. mybatis
    3. mysql

     

    프로젝트 구조

    User 정보를 MyBatis, MySql을 사용하여 저장하고 불러오는 간단한 예제를 해보자. 구조는 다음과 같다.

    프로젝트 구조

     

    DB 코드 작성

    create table user
    (
        id   int auto_increment
            primary key,
        name varchar(30) not null,
        addr varchar(30) not null
    );
    

     

    프로그램 코드

    [user.class]

    @Data
    public class User {
        private int id;
        private String name;
        private String addr;
    }
    

     

    [UserMapper.class]

    @Mapper
    public interface UserMapper {
    
        @Select("SELECT * FROM user")
        List<User> findAll();
    
        @Insert("insert into user values(#{id}, #{name}, #{addr})")
        void insertUser(User user);
    }
    

    UserMapper 인터페이스가 호출시 구현체가 SqlSession 메서드 호출을 통해 SQL 실행을 요청한다.

    #{}의 매개변수 명을 User의 파라미터와 동일하게 작성해줌으로써 매칭시킬 수 있다.

     

    [UserService.class]

    @Service
    @RequiredArgsConstructor
    public class UserService {
    
        private final UserMapper userMapper;
    
        public List<User> getAllUsers() {
            return userMapper.findAll();
        }
    
        public void insertUser() {
            User user = new User();
            user.setId(5);
            user.setName("kim");
            user.setAddr("seoul");
            log.info("user = {} ", user);
            userMapper.insertUser(user);
        }
    }
    

    데이터베이스에 등록된 모든 사용자 정보를 불러오는 getAllUsers() 메소드와 새로운 유저를 저장하는 insertUser() 메소드를 작성하였다.

     

    [UserController.class]

    @RestController
    @RequiredArgsConstructor
    public class UserController {
        private final UserService userService;
    
        @GetMapping("/users")
        public String AllUsers() {
            StringBuilder sb = new StringBuilder();
            List<User> allUsers = userService.getAllUsers();
            for (User allUser : allUsers) {
                sb.append(allUser.getName() + " ");
            }
    
            return sb.toString();
        }
    
        @GetMapping("/insert")
        public String insertUser() {
            userService.insertUser();
            return "DB에서 확인해보세요";
        }
    }
    

    @RestController 어노테이션을 추가해 별도의 템플릿을 사용하지 않고 body에 결과를 출력하도록 작성하였다.

    http://localhost:8080/users 로 접속하면 다음과 같은 화면이 나온다.

    http://localhost:8080/insert로 접속하면 insertUser()에 있는 User정보가 데이터베이스에 저장된다.

     

    http://localhost:8080/users 로 접속하면 다음과 같은 화면이 나온다. (DB에 있는 유저 정보의 이름을 불러온다)

    /users 화면

     

     

    http://localhost:8080/insert로 접속하면 insertUser()에 있는 User정보가 데이터베이스에 저장된다.

    데이터베이스

     

    @Insert의 매칭 규칙

    MyBatis의 @Insert 어노테이션은 다음과 같은 규칙으로 데이터베이스의 컬럼과 User의 필드값을 매칭한다.

    1. User 클래스에 setter가 있으면 setter를 호출한다. 

    2. 필드 이름을 기준으로 매핑한다.

    3. 생성자를 기준으로 매핑한다. 이 때 생성자의 파라미터 순서와 DB의 컬럼 순서가 일치해야 한다.

      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바