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 이름과 일치해야하므로 더 예쁘게 수정할 것