๐ ๐ Schedule Project API ๋ฌธ์

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/database_name
spring.datasource.username=name
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.schema-locations=classpath:schema_file
spring.sql.init.mode=always
CREATE DATABASE IF NOT EXISTS schedule;
USE schedule;
CREATE TABLE IF NOT EXISTS event
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '๊ณ ์ ์๋ณ์',
task VARCHAR(50),
created_time TIMESTAMP NOT NULL COMMENT '์์ฑ ๋ ์ง',
edited_time TIMESTAMP NOT NULL COMMENT '์์ ๋ ๋ ์ง',
owner VARCHAR(25) NOT NULL COMMENT '์์ฑ์๋ช
',
password VARCHAR(25) NOT NULL COMMENT '๋น๋ฐ๋ฒํธ'
);
โ ๋ฌธ์
์คํ๋ง๋ถํธ ์ฑ ์คํ ์, ์๋์ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง ๋ฐ์ํ๋ฉฐ ์คํ์ด ๋์ง ์์.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Failed to execute SQL script statement #2 of class path resource [schedule.sql]: CREATE TABLE event ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '๊ณ ์ ์๋ณ์', task VARCHAR(50), created_time TIMESTAMP NOT NULL COMMENT '์์ฑ ๋ ์ง', edited_time TIMESTAMP NOT NULL COMMENT '์์ ๋ ๋ ์ง', owner VARCHAR(25) NOT NULL COMMENT '์์ฑ์๋ช
', password VARCHAR(25) NOT NULL COMMENT '๋น๋ฐ๋ฒํธ' )
...
Caused by: java.sql.SQLSyntaxErrorException: Table 'event' already exists
โ ์์ธ
๊ธฐ์กด SQL ๋ฌธ
USE schedule;
CREATE TABLE event
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '๊ณ ์ ์๋ณ์',
task VARCHAR(50),
created_time TIMESTAMP NOT NULL COMMENT '์์ฑ ๋ ์ง',
edited_time TIMESTAMP NOT NULL COMMENT '์์ ๋ ๋ ์ง',
owner VARCHAR(25) NOT NULL COMMENT '์์ฑ์๋ช
',
password VARCHAR(25) NOT NULL COMMENT '๋น๋ฐ๋ฒํธ'
);
Caused by: java.sql.SQLSyntaxErrorException: Table 'event' already exists
์๋ฌ ๋ฉ์ธ์ง ๋ถ์ ๊ฒฐ๊ณผ, ์ด๋ฏธ ์กด์ฌํ๋ ํ ์ด๋ธ์ ๋ง๋ค๋ ค๊ณ ํด์ ๋ฌธ์ ๋ฐ์
๊ธฐ์กด์๋ main/resource ์๋์ ์คํค๋ง ํ์ผ์ ์์นํ๋๋ก ํ์.
์ด๋ฏธ ์กด์ฌํ๋ ํ ์ด๋ธ์ ์๋ก ์์ฑํ๋ ค๊ณ ํด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.
App ์คํ ์ด์ ์ DB ์ฐ๊ฒฐ ์ค์ ํ๋ฉด์ ํ
์ด๋ธ์ด ์์ฑ๋ ๊ฒ์ด ์์ธ์ผ๋ก ํ์
โ ํด๊ฒฐ
CREATE TABLE๊ณผ CREATE DATABASE ์์ IF NOT EXISTS ๋ฅผ ์ถ๊ฐํ์ฌ ํด๊ฒฐโ ๋ฌธ์
API ์์ฒญ ํ
์คํธ ์ค ์๋์ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง์ ํจ๊ป 400 BAD REQUEST ์ํ ์ฝ๋๋ฅผ ๋ฐํ ๋ฐ์.
2025-03-25T15:25:17.962+09:00 WARN 17340 --- [Schedule] [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]
โ ์์ธ
ResponseDTOโก๏ธjson ๋ณํ ๊ณผ์ ์์(json ํ์ฑ) ๊ฐ ์ธํ
์ด ๋์ง ์์.ResponseDTO์ @Getter ์ด๋
ธํ
์ด์
์ด ์์ด ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์์์.โ ํด๊ฒฐ
@Getter ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ์ฌ ํด๊ฒฐ๐ญ ๊ทธ ์ธ
Postman์ผ๋ก API ํ
์คํธ๋ฅผ ํ์์ผ๋ ๋ฌธ์ ๋ฐ์ ์ง์ ์ ์ ํํ๊ฒ ํ์
ํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ํ
์คํธ ์ฝ๋๋ ์๋ฌ ํธ๋ค๋ฌ๊ฐ ํ์ํ๋ค๊ณ ๋๋.System.out.println์ผ๋ก ์๋ ํ
์คํธ๋ฅผ ์งํ, ๋นํจ์จ์ ์ธ ํ
์คํธ ๋ฐฉ์์ด๋ผ๊ณ ํ๋จ.JUnit์ HTTP ์์ฒญ์ด ์๋ ๋ฉ์๋ ํธ์ถ๋ก ํ
์คํ
์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ API ํ
์คํธ์๋ ์ ์ ํ์ง ์์ ์ ์์.MockMvc๋ฅผ ํ์ฉํ๋ฉด Postman์ฒ๋ผ ์ปจํธ๋กค๋ฌ ๋จ๋ถํฐ ์ค์ HTTP ์์ฒญ์ ์๋ฎฌ๋ ์ด์
ํ์ฌ ํ
์คํ
์ด ๊ฐ๋ฅํ๋ค๊ณ ํจ. ์ด์ ๋ํด ์ถ๊ฐ ํ์ตํ ๊ณํ.โ ๋ฌธ์
API ์์ฒญ ํ
์คํธ ์ค ์๋์ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง์ ํจ๊ป ์ปจํธ๋กค๋ฌ ํธ์ถ์ ์คํจ.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Ambiguous mapping. Cannot map 'eventController' method
org.example.schedule.controller.EventController#findAllEvents()
to {GET [/events]}: There is already 'eventController' bean method
org.example.schedule.controller.EventController#findAllEventsByOwnerOrEditedTime(String, Timestamp, Timestamp) mapped.
...
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'eventController' method
org.example.schedule.controller.EventController#findAllEvents()
to {GET [/events]}: There is already 'eventController' bean method
org.example.schedule.controller.EventController#findAllEventsByOwnerOrEditedTime(String, Timestamp, Timestamp) mapped.
โ ์์ธ
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'eventController' method
// ์ ์ฒด ์กฐํ
@GetMapping
List<EventResponseDTO> findAllEvents() {
return eventService.findAllEvents();
}
// ์กฐ๊ฑด ์ผ์น ์ผ์ ๋ค ์กฐํ (์์ ๋ ์ง, ์์ฑ์๋ช
)
@GetMapping
List<EventResponseDTO> findAllEventsByOwnerOrEditedTime(
@RequestParam String owner,
@RequestParam Timestamp startDate,
@RequestParam Timestamp endDate) {
return eventService.findAllEventsByOwnerOrEditedTime(owner, startDate, endDate);
}
GET ์์ฒญ)์ด์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋ค๋ฆ.GET, POST etc.)์ผ๋ก ๋ฉ์๋ ๋งตํ์ ๊ตฌ๋ถํ๋ค.โ ํด๊ฒฐ
โ ๋ฌธ์
Timestamp startDate ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ์ ์คํจํจ..MethodArgumentTypeMismatchException: Method parameter 'startDate': Failed to convert value of type 'java.lang.String' to required type 'java.sql.Timestamp'; Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.sql.Timestamp] for value [2025-03-21T00:00:00]]
โ ์์ธ
Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.sql.Timestamp]
String ์์ Timestamp ํ์
๋ณํ์ ์คํจํ์.2025-03-03 ๊ณผ ๊ฐ์ด ๋ ์ง ํฌ๋งท์ ๋ง์ถฐ์ ์์ฒญ์ ๋ณด๋์์๋ ๋ถ๊ตฌํ๊ณ ๋ณํ์ด ์ด๋ฃจ์ด์ง์ง ์์.โ ํด๊ฒฐ
1์ฐจ ์๋
@DateTimeFormat ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ ๋ ์ง ํฌ๋งท์ผ๋ก ์ธ์๋๋๋ก ํจ.String์ผ๋ก ์ธ์ ๋จ.2์ฐจ
Timestamp ํ์
์ @DateTimeFormat ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด๋ ์ธ์์ด ์๋๋ค.@DateTimeFormat ์ด๋
ธํ
์ด์
์ด ์ง์ํ๋ ํ์
๋ค (Date, LocalTime, LocalDateTime) ์ค์์LocalDateTime์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ํด๊ฒฐ.โ ๋ฌธ์
โ ์์ธ
โ ํด๊ฒฐ
โ
๋ฐฉ๋ฒ 1) sc.nextLine() ์ผ๋ก ๊ฐํ๋ฌธ์ ์ ๊ฑฐ
โ ๋ฐ๋ผ์ ์ผ๋ถ ๋ก์ง์ ๋ฉ์๋๋ก ๋ถ๋ฆฌ
โ๏ธ ์ฝ๋๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ๋ ๊น๋ํด์ง๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ด
โ ๋ฉ์๋ ๋ถ๋ฆฌํ์์๋ ์คํ๋ ค ์ฝ๋๊ฐ ๋ ๋ณต์กํด ๋ณด์ด๋ ๊ฒฝ์ฐ๊ฐ ์์
๐ญ ๋ฉ์๋ ์ญํ ์ด ๋ช ํํ์ง ์๊ฑฐ๋ ๋ฉ์๋ ์ด๋ฆ์ด ์ง๊ด์ ์ด์ง ์์ ๊ฐ๋ฅ์ฑ
์ผ์ ์ ๋ฐ์ดํธ ํ ๋ ์ ๋ฐ์ดํธ ์์ ์ ๋ ํฌ์งํ ๋ฆฌ์์ ์ฒ๋ฆฌํ ๋ now()๋ก ์ฐ์ด์ ์ ๋ฐ์ดํธํ๊ฒ ํ๋๋ฐ.. ์ด๋ ๊ฒ ํด๋ ๋๋์ง? ์ด๊ฒ๋ ๋น์ฆ๋์ค ๋ก์ง์ด๋๊น ์๋น์ค ๋ ์ด์ด์์ ๊ฐ์ ๋ฏธ๋ฆฌ ๋๊ฒจ์ฃผ์ด์ผํ๋์ง ์๋๋ฉด ๋์ค์ JPA๋ฅผ ์ฐ๊ฒ ๋๋ค๋ฉด @LastModifiedDate < ๊ฐ์ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ ์ข์์ง