본문 바로가기

데일리 공부 기록

hands on vue3 - vue & spring-boot mysql로 연동하기(빠른 예제)

728x90

[목표]

controller-service-dao순으로 MVC2패턴을 이용하여 테스트를 해볼 것이다.

 

vue에서 버튼을 눌렀을 때 

Mysql 안에 있는 DB 값을 화면에 띄우는 게 목표다.

 

추가로

MyBatis에 대한 간단한 개념정리를 할 것이다. 

 

진행할 순서는 다음과 같다.

0. MySQL 테이블 생성하기

1. 패키지 생성 및 정리(Controller,Service,Dao 생성하기)

2. DB정보 설정 및 MyBatis 셋팅

3. 로직 구현 

4. 화면에서 요청하여 값을 확인하기


MySQL 테이블 생성
CREATE TABLE member (
 seq        INT NOT NULL AUTO_INCREMENT,
 mb_id     VARCHAR(20),
 mb_pw    VARCHAR(20),
 mb_tele    VARCHAR(50),  
  PRIMARY KEY(seq)
)

패키지 생성 및 정리

Spring boot는 Spring과 조금 다르게

프로젝트를 생성한 패키지 하단에만 component-scan이 먹는다. 

 

다른 설정 방법이 있는 줄은 잘 모르지만.. 그냥 초기 생성된 패키지 하단에 만들자.

패키지는 총 6가지이다. 

패키지 생성이 끝났으면 

Controller, Service, Dao를 만들자.

 

 


Controller, Service, DAO, DTO, xml 만들기

 

[MemberController.java]

package com.example.demo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.DTO.MemberDTO;
import com.example.demo.service.MemberService;

@RestController
public class MemberController {
	
	@Autowired
	MemberService mService;
	
	@RequestMapping(value="/getMember", method=RequestMethod.GET)
	public List<MemberDTO> getMember(){
		List<MemberDTO> list = mService.getMember();
		return list;
	}
}


[MemberService.java]

package com.example.demo.service;

import java.util.List;

import com.example.demo.DTO.MemberDTO;

public interface MemberService {
	public List<MemberDTO> getMember();
}

 


[MemberServiceImpl.java]

 

package com.example.demo.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demo.DTO.MemberDTO;
import com.example.demo.dao.MemberDAO;

@Service
public class MemberServiceImpl implements MemberService{
	
	@Autowired
	MemberDAO mDao;

	@Override
	public List<MemberDTO> getMember() {
		List<MemberDTO> list = mDao.getMember();
		return list;
	}

}

 

 


[MemberDAO]

package com.example.demo.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.DTO.MemberDTO;

@Mapper
public interface MemberDAO {
	public List<MemberDTO> getMember();
}

 

 


[MemberDTO.java]

 

package com.example.demo.DTO;

public class MemberDTO {
	private String mb_id;
	private String mb_pw;
	private String mb_tele;
	
	public String getMb_id() {
		return mb_id;
	}
	public void setMb_id(String mb_id) {
		this.mb_id = mb_id;
	}
	public String getMb_pw() {
		return mb_pw;
	}
	public void setMb_pw(String mb_pw) {
		this.mb_pw = mb_pw;
	}
	public String getMb_tele() {
		return mb_tele;
	}
	public void setMb_tele(String mb_tele) {
		this.mb_tele = mb_tele;
	}
}

 


[Member.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.example.demo.dao.MemberDAO">
 
    <select id="getMember" resultType="MemberDTO">
        SELECT * FROM Member
    </select>
 
</mapper>

 

 


MyBatis sqlSession 셋팅하기

이해하려 하지 말고

수정할 부분만 어떤 것을 넣어야하는 지만 알면됨

 

[DatabaseConfig.java]

package com.example.demo.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;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@MapperScan(basePackages="com.example.demo.dao")
@EnableTransactionManagement
public class DatabaseConfig {
	
    @Bean
    public  SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("com.example.demo.DTO");
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:com/example/demo/mapper/*.xml"));
        return sessionFactory.getObject();
    }
    
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
      final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
      return sqlSessionTemplate;
    }
}

DataBaseConfig에 대해 더 궁금하시다면

아래를 보고 가세요

더보기

DB데이터를 가져오는 흐름은 

큰 틀로 보면 아래 사진과 같다.  

출처 skplanet tacademy

 

DatabaseConfig.java는

Spring에서 dispatcher context이다.

 

Spring에서는 보통 xml로 설정을 많이한다. 

예를 들어

web.xml, servlet.xml, root-context.xml

이런 파일명들에다가 설정을 했었다. 

 

하지만

DatabaseConfig.java(스프링부트) 파일처럼

어노테이션을 선언하여 환경설정을 해주는 경우도 있다. 

 

아무튼 우리가 헷갈리는 부분은

 

DAO의 @Mapper 어노테이션과

XML의 namespace가 연결되어야 하고.. 

 

DatabaseConfig.java 파일에는 

패키지명을 또 알려줘야하고... 복잡하다.. 

 

그림을 보며 이해해보자

 

 빨간 영역을 자세히 보자.

시간이 흘러 프로젝트가 조금 커지면 

@Mapper로 선언된 파일과 다양한 mapper.xml 생길 것이다.

 

그렇다면

@Mapper는 어떤 XML이랑 연결되어 있을까?

 

서로 짝을 지어줘야한다.

 

mapper.xml의 namespace가 바로 그 연결고리다. 

아래의 사진은 한 쌍이다.

 

또한 중요한 것이 있다. 

 

MyBatis입장에서는

MyBatis 자신에게 요청하는 파일들이 어디에 있는지 미리 알고 있어야한다.

 

비유하자면

식당 가게 입구가 어딘지 알아야

손님이 오는지 안오는지 알지.. 

 

그것을 알려주는 환경파일이

DatabaseConfig.java다.

 

 

 

 

 

 

 

 


[application.properties]

server.port=8082
spring.datasource.url=jdbc:mysql://localhost:3306/vueprojectdb?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

 

자 이제 모든게 끝났다!

vue 서버

spring-boot 서버를 모두 키고

 

테스트해보자


Vue에서 버튼을 눌러 데이터 가져오는지 확인하기

[App.vue]

<template>
  <button @click="dbTest">DB Test Button</button>
</template>

<script>

export default {
  methods: {
    dbTest(){
      fetch('/getMember')
        .then((response) => response.json())
        .then((data)=> console.log(data[0]));
    },
  }
}
</script>

<style scoped>
#notice{
  border: 1px solid black;
}
</style>

 

 

잘 나오는 걸 확인할 수 있다.