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의 경로 추가

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 프레임워크.
해당 코드는 논리적으로 매핑되는 엔티티 클래스와 데이터베이스 테이블의 이름을 그대로 사용하는 것을 의미하여 논리적 네이밍과 물리적 네이밍을 구분하지 않고 그대로 매핑하는 전략
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 이름과 일치해야하므로 더 예쁘게 수정할 것