본문 바로가기
React + Spring Boot

[IntelliJ]React + Spring Boot + MariaDB 프로젝트 구성

by Jellfyu 2022. 7. 5.

0. 개발 환경 및 툴 버전

IntelliJ [Ultimate]

  • 버전: 2022.1.3
  • 빌드: 221.5921.22
  • 2022년 6월 21일

- 인텔리제이 버전마다 UI가 다르니 참고.

JDK

  • 1.8.0_333

Tomcat

  • 9.0.63

Node.js

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

얘는 언제나 최신 버전 씁시다.

1. Spring Boot 프로젝트 생성

 

File ㅡ> New ㅡ> Project...
Next
Create
프로젝트 생성 직후 상황, static과 templates를 지우고 mapper를 만듦

이제 DB 구성

 

2. DataBase 생성 및 연결 준비

DB 접속에 필요한 username과 password 기억해두시고

 

- 테이블 생성

CREATE TABLE demo_table
(
    DEMO_ID   VARCHAR(32) NULL,
    DEMO_NAME VARCHAR(32) NULL
);

 

-application.properties 입력

#DB info
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:본인포트/본인스키마
spring.datasource.username=본인username
spring.datasource.password=본인password

#mybatis
mybatis.type-aliases-package=com.example.demo.mapper
mybatis.mapper-locations=mapper/*.xml

작성자 기준 

spring.datasource.url=jdbc:mariadb://localhost:3306/demodb

 

본인username, 본인password 마저 입력.

 

#mybatis

type-aliases-pacage= *******

이따가 mapper로 만들어줄 건데 dao로 쓰시는 분들은 dao로 입력하세요

 

mapper-locations=mapper/*xml

xml 파일 있는 곳 resources 아래 mapper아래. xml 파일

 

여기까지 하고 연결 테스트하실 분들은 해보면 좋습니다. 검색ㄱㄱ

 

- 데이터 입력

대충 넣습니다.

 

3. 데이터 가져오기

com.example.demo 우클릭 ㅡ> New ㅡ> Package

이미지처럼 4개 만들어주세요

아까 application.properties 에 "mybatis.type-aliases-package=" 쪽에 기입한 대로 mapper폴더 이름 확인

 

 

 

 

controller는 나중에 만들어주고 아래 순서대로 만들어 줄게요

 

 

DemoVo.java

import lombok.Data;

@Data
public class demoVo {
    private String demo_id;
    private String demo_name;
}

아까 만든 db스키마 대로 저장할 객체를 만들고 lombok의 @Data를 이용해 get,set 메소드 만들어주고

 

DemoMapper.java     ※ interface

import com.example.demo.domain.DemoVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface DemoMapper {
    List<DemoVo> select();
    void insert(DemoVo vo);
}

우리가 원하는 형태의 작업을 만들어 줍니다. 간단하게 select랑 insert만 해볼게요

 

Demo_SQL.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.mapper.DemoMapper">

    <select id="select" resultType="com.example.demo.domain.DemoVo">
        SELECT *
        FROM DEMO_TABLE
    </select>

    <insert id="insert">
        INSERT INTO DEMO_TABLE(
            DEMO_ID
            ,DEMO_NAME
        ) VALUES(
            #{demo_id}
            ,#{demo_name}
        )
    </insert>
</mapper>

DemoService.java

import com.example.demo.domain.DemoVo;
import com.example.demo.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class DemoService {
    @Autowired
    private DemoMapper mapper;

    public List<DemoVo> select(){ return mapper.select(); }
    public void insert(DemoVo vo){ mapper.insert(vo);}
}

SQL.xml과 service로 어떻게 해서 어떻게 넘겨줄지를 구현해줍니다. xml에

<mapper namespace=" *** "> 부분 확인해주시고

 <select id=" *** ">  ,  <insert id=" *** ">에

DemoMapper에 만든 것 대로 연결

 

#{***} 부분은 DemoVo에 입력한 것과 이름 같게

이제 conroller를 구현해봅시다.

 

DemoController.java

import com.example.demo.domain.DemoVo;
import com.example.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class DemoController {
    @Autowired
    private DemoService demoService;
    
    @GetMapping("select")
    public List<DemoVo> getSelectList(){ return demoService.select(); }
    
    @GetMapping("insert")
    public void insertDemoVo(){
        DemoVo vo = new DemoVo();
        vo.setDemo_id("내가만든dummy_id");
        vo.setDemo_name("내가만든dummy_name");
        
        demoService.insert(vo);
    }
}

바로 뿌려야 하니까 @RestController 쓰고

 

insert는 일단 테스트 하기 위해서 Get으로 썼어요 이따 React쪽 세팅되면 Post로 바꿉시다

 

4. 톰캣 연동

Edit Configurations... 클릭
' + ' 눌러서 Tomcat Serve ㅡ> Local 클릭 (TomEE 아니에여)
Configure... 클릭 본인이 설치한 톰캣 경로 입력

톰캣 설치한 경로 지정해주시고 아래 HTTP port: 기억해주세요

Deployment ㅡ> ' + ' ㅡ> Artifact...
demo:war exploded

Application context: /

 

만 남겨줍니다.

 

이제 톰캣 실행해주시면 아래 화면이 나옵니다.

우리는 Get으로 select 줬으니까 입력 ㄱㄱ

아까 db에 저장했던 데이터들이 정상적으로 출력됩니다.

 

이제 insert 한번 하고 다시 select 해볼게요

정상적으로 insert 됨을 확인할 수 있네요

 

4. React 설치

https://blog.naver.com/tjddnjs5092/222650157261

 

[IntelliJ Spring Boot+React 제 1장] Spring Boot 프로젝트 생성 및 React 프로젝트 생성

Spring boot 프로젝트 생성. Spring Intializr 선택을 하였고 위와같이 세팅을 해주었습니다 Dependenc...

blog.naver.com

위 게시글을 참고하여 작성하였습니다.

 

시작 전에 node.js 설치하시고 IntelliJ에서 플러그인 연결해주셔야 아래 Terminal이 정상 작동합니다.

안되어 있으면 하고 오세요

Terminal 열어 src로 진입후 npx create-react-app

npx create-react-app front

이름은 자유롭게 지으셔도 됩니다. 작성자는 front

성공!

cd front
npm install
npm run-script build
npm start

front 폴더로 이동해주신 뒤에 차례로 npm install, npm run-script build 입력해줍니다.

 

build가 완료되면 npm start

 

이렇게 나옵니다 포트는 3000

 

App.js  //  App.css  //  index.css

App.js는 위 이미지처럼 드래그한 부분만 나머지 css는 내용을 모두 지워줄게요

 

"proxy": "http://localhost:8090",

저는 8090에서만 받아올 거라 package.json 파일에 proxy를 8090에 두었습니다.

 

8090과 axios를 이용하여 통신하겠습니다.

https://axios-http.com/kr/docs/intro

 

시작하기 | Axios Docs

시작하기 브라우저와 node.js에서 사용할 수 있는 Promise 기반 HTTP 클라이언트 라이브러리 Axios란? Axios는 node.js와 브라우저를 위한 Promise 기반 HTTP 클라이언트 입니다. 그것은 동형 입니다(동일한 코

axios-http.com

CTRL + C 두 번 눌러서 3000 포트 닫아주시고 

npm install axios

터미널에 npm install axios 입력

DemoController.java

@GetMapping("select")
public List<DemoVo> getSelectList(){ return demoService.select(); }

@GetMapping("insert")
public void insertDemoVo(){
    DemoVo vo = new DemoVo();
    vo.setDemo_id("내가만든dummy_id");
    vo.setDemo_name("내가만든dummy_name");

    demoService.insert(vo);
}

insert는 get으로 만든 김에 테스트 한번 더해보고 post로 고쳐보도록 하죠

 

App.js

import './App.css';
import axios from 'axios';
function App() {

  function selecttestAxios(){
    axios.get('/select')
        .then(function (res){
          console.log(res.data);  // getSelectList 버튼을 누르면 데이터들이
        });
  }
    function inserttestAxios(){
        axios.get('/insert')
            .then(function (res){
                console.log("insert OK"); // Insert 버튼을 누르면 "insert OK"
            });
    }
  return (
      <div className="App">
        <button onClick={() => selecttestAxios()}>getSelectList</button>
          <button onClick={() => inserttestAxios()}>Insert</button>
      </div>
  );
}

export default App;

npm start

+

Tomcat도 켜주시고

각 버튼을 누르면 이전 코드의 주석부분처럼 출력이 되겠죠.
getSelectList클릭 ㅡ> Insert 클릭*3 ㅡ> getSelectList클릭 ㅡ> Insert 클릭ㅡ> getSelectList클릭

이제 DemoController의 insert를 Post요청으로 바꿔 실행해 보겠습니다.

 

DemoController.java

import com.example.demo.domain.DemoVo;
import com.example.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class DemoController {
    @Autowired
    private DemoService demoService;

    @GetMapping("select")
    public List<DemoVo> getSelectList(){ return demoService.select(); }

    @PostMapping("insert")
    public void insertDemoVo(@RequestBody DemoVo vo){ demoService.insert(vo); }
}

 

 

App.js

import './App.css';
import axios from 'axios';
import {useState} from "react";
function App() {
    const [id,setid] = useState(1);
  function selecttestAxios(){
    axios.get('/select')
        .then(function (res){
          console.log(res.data);
        });
  }
    function inserttestAxios(){
        axios.post('/insert',{
            demo_id : id
            ,demo_name : "dummy"
        })
            .then(function (res){
                console.log("insert OK");
                setid(id+1);
            });
    }
  return (
      <div className="App">
        <button onClick={() => selecttestAxios()}>getSelectList</button>
          <button onClick={() => inserttestAxios()}>Insert</button>
      </div>
  );
}

export default App;

전달하는 JSON은 DemoVo에 만들어준 변수와 같게 해줘야 잡히니 주의해주시고

 

Tomcat만 재실행

getSelectList클릭 ㅡ> Insert 클릭*4 ㅡ> getSelectList클릭

와~ 성공~~

 

MVC로만 CRUD를 해본 제 입장에서는 당장 사용해볼 만한 React DB 연동 법이 이것밖에 떠오르지 않더라고요.

 

여기까지만 뚫려도 이것저것 응용해내실 개발자분들이 많으실 텐데 개발하시는 거 파이팅입니다!

 

고생하셨습니다.

 

 

그럼 안녕~

반응형