Dev JS Blog

Spring boot Starter - DB 연결 과 Mybatis 연동하기! 본문

옛날 창고/스프링

Spring boot Starter - DB 연결 과 Mybatis 연동하기!

Dev JS 2021. 2. 2. 23:24
728x90

Spring boot Starter로 DB 를 연결 해보려한다.

Stater..? 가 뭔지 모르는 사람은 참고

2021/02/01 - [IT/스프링] - eclipse STS 로 Spring Boot 프로젝트 시작하기

 

eclipse STS 로 Spring Boot 프로젝트 시작하기

https://spring.io/tools Spring Tools 4 is the next generation of Spring tooling Largely rebuilt from scratch, Spring Tools 4 provides world-class support for developing Spring-based enterprise appli..

allmana.tistory.com


 

그럼 바로 DB 연결을 해보자!

 

Add Starters 클릭

연결할 DB의 Driver를 클릭해준다.

나는 MariaDB에 연결할거니까 MariaDB Driver 로 선택해주고 Finish.

그다음 spring 의 설정파일인 application 파일에 간다.

파일에서 datasource라고 작성해주면 쫘악 나온다.

나는 application.yml 파일을 쓰는데 properties 파일을 쓴다면.. 참고..

2021/02/01 - [IT/스프링] - Spring boot application.properties 를 가독성있게 바꿔보자

 

Spring boot application.properties 를 가독성있게 바꿔보자

Spring Boot 에 application.properties 은 다르게도 쓸수있다. https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#mapping-yaml-to-properties Spring Boot Features G..

allmana.tistory.com


많은 설정들이 있지만 필요한 몇가지만 넣고 DB 연결을 할것이다.

driver-class-name 해주고 or 정도만 쳐도 이미 다 완성해준다.

언제나 말하지만 툴을 쓴다면 툴을 언제나 활용하자.

이렇게 설정해주자~


이제는 Mybatis를 설치해보자.

준비물 - Mybatis , lombok Plugin(필수는 아니지만 lombok을 활용할 예정)

아까 위에 처럼 add starters 를 클릭해줘서

lombok과 Mybatis를 설치해줍니다.

 

1) Bean 만들기

package com.project.login.model;

import lombok.Data;

@Data
public class Login {
	
	private String userId;
	private String password;
	
}

Login.java bean을 생성.

여기서 바로 lombok을 이용합니다.

@Data 는 Lombok 을 이용한 (getter,setter,serialize 등등)을 한번에 해주는 어노테이션 입니다.

 

2) mapper 만들기

package com.project.login.service;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import com.project.login.model.Login;

@Mapper
@Repository
public interface LoginRepository {
	List<Login> findAll();
}

LoginRepository라는 interface를 만듭니다. @Mapper 와 @Repository 어노테이션을 추가해줍니다.

3) dtd(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">
<mapper namespace="com.project.login.service.LoginRepository">
	<select id="findAll" resultType="com.project.login.model.Login">
		SELECT 'a' AS user_id FROM dual
	</select>
</mapper>

여기서 namespace 에는 Mapper 경로 쿼리 아이디는 mapper 의 메소드와 일치 시켜줍니다.

resultType 은 1) 파일인 bean 파일 경로를 써줍니다.

dtd 파일의 기본 경로는 resource 하위 입니다.

경로를 바꾸고 싶다면

mybatis:
  mapper-locations: mapper/**/*.xml # mapper 기본경로 
  configuration:
    map-underscore-to-camel-case: true 

application.yml 에 mapper-locations 에 경로를 지정해주시길 바랍니다.

저의 현재 경로입니다.

그다음 추가한  configuration:  map-underscore-to-camel-case: true  얘는

쿼리 컬럼명을 camel 형식으로 변경시켜주는 것입니다.

기본적으로 DB 컬럼명은 언더바를 사용합니다 . 예) user_id

bean 파일이나 JAVA 에서는 보통 camel 형식을 사용합니다. 예) userId

그래서 쿼리 결과와 Bean 변수명이 일치해야 맵핑이 되기 때문에 

camel 형식으로 자동 변환 될 수 있도록 설정에 추가해줍니다.

 

4) service 만들기

package com.project.login.service;

import java.util.List;

import org.springframework.stereotype.Service;
import com.project.login.model.Login;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service //service
public class LoginService {
	
	private final LoginRepository loginRepository;
	
	public List<Login> findAll(){
		return loginRepository.findAll();
	}
}

@Service 어노테이션 주고 

중요! @RequiredArgsConstructor 추가

이 어노테이션이 들어가지 않으면 

private final LoginRepository 가 에러가 납니다.

추가로) 이게 에러가 안고쳐지면 lombok 플러그인이 이클립스 툴에 제대로 적용되지 않는 상태입니다.

저도 그래서 꽤나 애를 먹었습니다.

해결법은 나중에 올려보겠습니다.

3) RestController 구현하기

package com.project.login.web;

import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import com.project.login.model.Login;
import com.project.login.service.LoginService;

import lombok.RequiredArgsConstructor;

@Controller
@RequiredArgsConstructor
public class LoginController {
	
	private final LoginService loginService;
	
	@GetMapping("/")
	public String index(){
		List<Login> list = loginService.findAll();
		System.out.println(list);
		return "index";
	}
}

 

 

저는 그냥 controller에 구현하겠습니다.

service 를 @RequiredArgsConstructor 를 이용해서 생성 후 이용해줍니다.

index 페이지에 간다면 System out에 로그가 찍혀야겠지요?

 

결과)

Login bean객체에 userId의 값이 맵핑이 된걸 볼 수 있습니다.

쿼리에 password 값은 없었기 때문에 null 값으로 나옵니다.

 


이 구성을 잘 기억하시길 바랍니다.

DTD(xml) -> Mapper(interface) -> Serivce -> Controller 

 

 

728x90
Comments