<졸업작품> 03. MySQL&DataGrip 연동

박서연·2023년 7월 27일
0

Graduation

목록 보기
4/6

1. MySQL 설치

참고
https://velog.io/@joajoa/MySQL-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95

2. DataGrip 설치

User와 Password는 rds 생성시 입력한 이름과 비밀번호

참고
https://uwwwwwu.tistory.com/34

📢 오류 발생

DataGrip에서 Driver class 'com.mysql.cj.jdbc.Driver' not found Driver files are not downloaded 오류 메세지 발생
해결
main menu -> Data sources에서 Driver로 넘어가 해당 DB를 찾고, cj.jdbc.Driver의 경로 추가

3. IntelliJ와 연동

build.gradle dependencies에 아래 코드 추가

	//mysql 추가
	runtimeOnly ('com.mysql:mysql-connector-j') //mysql8
	implementation ('org.springframework.boot:spring-boot-starter-jdbc')

src/main/resources/application.properties에 아래 코드 추가

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://serverdb.cafcib2vatvt.us-east-1.rds.amazonaws.com/co_work?autoReconnect=true&setTimezone=Asia/Seoul
spring.datasource.username=admin 		#RDS 이름
spring.datasource.password=dbsgpp00!	#RDS 비밀번호

📢 오류 발생


해결
application.properties에 아래 코드 추가

spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

설명
Hibernate는 데이터베이스 테이블과 엔티티 클래스 간의 이름 매핑을 담당하는 ORM 프레임워크.
해당 코드는 논리적으로 매핑되는 엔티티 클래스와 데이터베이스 테이블의 이름을 그대로 사용하는 것을 의미하여 논리적 네이밍과 물리적 네이밍을 구분하지 않고 그대로 매핑하는 전략

4. 코드 수정

controller

package com.example.graduation.controller;

import com.example.graduation.dto.MinutesForm;
import com.example.graduation.entity.Minutes;
import com.example.graduation.entity.Users;
import com.example.graduation.repository.UsersRepository;
import com.example.graduation.service.MinutesService;
import com.example.graduation.service.UsersService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@Slf4j //log
@RequiredArgsConstructor
public class CalendarController {

    private final MinutesService minutesService;
    private final UsersService usersService;

    //1. 회의록 생성
    @PostMapping("/calendars/minutes")
    public MinutesForm createMinutes(@RequestBody MinutesForm form) {
        MinutesForm target = minutesService.create(form);
        return target;
    }

    //2-1. 회의록 조회(전체)
    @GetMapping("/calendars/minutes/all")
    public List<Minutes> getAllMinutes() {
        List<Minutes> minutesList = minutesService.watchAll();
        return minutesList;
    }

    // 2-2. 회의록 부분 조회(특정 년도, 월)
    @GetMapping("/calendars/minutes/all/{yearMonth}")
    public List<Minutes> getAllMinutes(@PathVariable String yearMonth) {
        List<Minutes> minutesList = minutesService.watchDates(yearMonth);
        if (minutesList.isEmpty()) {
            return null;
        }
        else {
            return minutesList;
        }
    }

    //2-2. 회의록 조회(세부)
    @GetMapping("/calendars/minutes/{date}")
    public Optional<Minutes> getMinutes(@PathVariable String date) {
        Optional<Minutes> minutes = minutesService.watch(date);
        return minutes;
    }


    //3. 회의록 수정
    @PatchMapping("/calendars/minutes/{date}")
    public MinutesForm editMinutes(@PathVariable String date, @RequestBody MinutesForm form) {
        MinutesForm minutes = minutesService.edit(date, form);
        return minutes;
    }
//
    //4. 회의록 삭제
    @DeleteMapping("/calendars/minutes/{date}")
    public String deleteMinutes(@PathVariable String date) {
        minutesService.delete(date);
        return "Completely Deleted";
    }

}

dto

package com.example.graduation.dto;

import com.example.graduation.entity.Minutes;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.SimpleTimeZone;


@ToString
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Setter
public class MinutesForm {
    @JsonProperty("id")
    private  Long id;

//    @JsonProperty("userId")
//    private Long userId;

    @JsonProperty("teamId")
    private Long teamId;
    @JsonProperty("date")
    private String date;
    @JsonProperty("title")
    private String title;
    @JsonProperty("content")
    private String content;


    // dto -> entity 연결
    public Minutes toEntity(MinutesForm dto) {
        Minutes entity = new Minutes();
        entity.setMinutes_id(dto.getId());
//        entity.setUserId(dto.getUserId());
        entity.setTeam_id(dto.getTeamId());
        entity.setDate(dto.getDate());
        entity.setTitle(dto.getTitle());
        entity.setContent(dto.getContent());
        return entity;
    }
}

entity

package com.example.graduation.entity;

import com.example.graduation.dto.MinutesForm;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

//요청용
@Entity
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
public class Minutes {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long minutes_id;

//    @Column
//    private Long userId;

    @Column
    private Long team_id;

    @Column
    private String date;
    @Column
    private String title;
    @Column
    private String content;

//    public void update(String title, String content, Long userId) {
//        this.title = title;
//        this.content = content;
////        this.userId = userId;
//    }

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
//        this.userId = userId;
    }

    public MinutesForm toDto(Minutes entity) {
        MinutesForm dto = new MinutesForm();
        dto.setId(entity.getMinutes_id());
//        dto.setUserId(entity.getUserId());
        dto.setTeamId(entity.getTeam_id());
        dto.setDate(entity.getDate());
        dto.setTitle(entity.getTitle());
        dto.setContent(entity.getContent());
        return dto;
    }
}

repository

package com.example.graduation.repository;

import com.example.graduation.entity.Minutes;
import org.springframework.data.repository.CrudRepository;

import java.util.ArrayList;
import java.util.Optional;

//extends 뒤에는 CrudRepository를 작성하여 여러 기능을 사용할 수 있도록 하고, <> 안의 파라미터는 사용할 entity와 그 대푯값(이 프로젝트에서는 id)의 타입 작성
public interface MinutesRepository extends CrudRepository<Minutes, Long> {
    @Override
    ArrayList<Minutes> findAll();

    Optional<Minutes> findByDate(String date);

    ArrayList<Minutes> findByDateLike(String date);
}

service

package com.example.graduation.service;

import com.example.graduation.dto.MinutesForm;
import com.example.graduation.entity.Minutes;
import com.example.graduation.repository.MinutesRepository;
import jakarta.transaction.Transactional;
import jakarta.websocket.server.ServerEndpoint;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
@Slf4j
@RequiredArgsConstructor
public class MinutesService {

    private  final MinutesRepository minutesRepository;

    @Transactional
    public MinutesForm create(MinutesForm dto) {
        Minutes minutes= minutesRepository.save(dto.toEntity(dto));
        Minutes target = minutesRepository.findById(minutes.getMinutes_id()).orElse(null);
        MinutesForm targetToRecv = target.toDto(target);
        return targetToRecv;
    }

    @Transactional
    public List<Minutes> watchAll() {
        List<Minutes> target= minutesRepository.findAll();
        log.info(target.toString());
        return target;
    }

    @Transactional
    public List<Minutes> watchDates(String filterMonth) {
        List<Minutes> minutesList = minutesRepository.findByDateLike(filterMonth + "%");
        return minutesList;
    }

    @Transactional
    public Optional<Minutes> watch(String date) {
        Optional<Minutes> minutes = minutesRepository.findByDate(date);
        return minutes;
    }

    @Transactional
    public MinutesForm edit(String date, MinutesForm dto) {
        //현재 입력한 date가 repository에 존재할 경우 edit. orElseThrow()
        Minutes minutes = minutesRepository.findByDate(date).orElse(null);
        minutes.update(dto.getTitle(), dto.getContent());
        MinutesForm target = minutes.toDto(minutes);
        return target;
    }

    @Transactional
    public void delete(String date) {
        Minutes minutes = minutesRepository.findByDate(date).orElse(null);
        minutesRepository.delete(minutes);
    }
}

application.properties

spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization = true

#mysql ??
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://serverdb.cafcib2vatvt.us-east-1.rds.amazonaws.com/co_work?autoReconnect=true&setTimezone=Asia/Seoul
spring.datasource.username=admin
spring.datasource.password=dbsgpp00!

spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.1'
	id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	//thymeleaf
	//implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

	//UserDto 생성 시 필요
	implementation 'org.springframework.boot:spring-boot-starter-validation'

	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-mustache'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	//runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	//mysql 추가
	runtimeOnly ('com.mysql:mysql-connector-j') //mysql8
	implementation ('org.springframework.boot:spring-boot-starter-jdbc')
}

tasks.named('test') {
	useJUnitPlatform()
}

> entity 이름이 DB table의 column 이름과 일치해야하므로 더 예쁘게 수정할 것

0개의 댓글