Skip to content

Commit f4e534f

Browse files
authored
Merge pull request #106 from DevKor-github/main
[Merge] main to deploy
2 parents dc4f78f + d64f8be commit f4e534f

File tree

9 files changed

+96
-130
lines changed

9 files changed

+96
-130
lines changed

ontime-back/Dockerfile

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
# 빌드 단계: Gradle을 사용하여 JAR 파일을 빌드
2-
FROM gradle:7.4-jdk17 AS build
3-
ENV APP_HOME=/app
4-
WORKDIR $APP_HOME
5-
COPY . ./
6-
RUN ./gradlew build -x test
7-
81
FROM openjdk:17
92
WORKDIR /app
10-
COPY --from=build /app/build/libs/ontime-back-0.0.1-SNAPSHOT.jar app.jar
3+
COPY project.jar app.jar
114
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

ontime-back/docker-compose.yml

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,45 +10,10 @@ services:
1010
ports:
1111
- "80:8080" # HTTP 요청을 Spring Boot 8080으로 전달
1212
- "443:8443" # HTTPS 요청을 Spring Boot 8443으로 전달
13-
environment:
14-
SPRING_DATASOURCE_URL: jdbc:mysql://mysql-container-ontime:3306/ontime_db
15-
SPRING_DATASOURCE_USERNAME: ontime
16-
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
17-
SPRING_APPLICATION_NAME: ${SPRING_APPLICATION_NAME}
18-
SPRING_JPA_HIBERNATE_DDL_AUTO: ${SPRING_JPA_HIBERNATE_DDL_AUTO}
19-
SPRING_DATASOURCE_DRIVER_CLASS_NAME: ${SPRING_DATASOURCE_DRIVER_CLASS_NAME}
20-
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
21-
JWT_ACCESS_EXPIRATION: ${JWT_ACCESS_EXPIRATION}
22-
JWT_REFRESH_EXPIRATION: ${JWT_REFRESH_EXPIRATION}
23-
JWT_ACCESS_HEADER: ${JWT_ACCESS_HEADER}
24-
JWT_REFRESH_HEADER: ${JWT_REFRESH_HEADER}
25-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID}
26-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET}
27-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_SCOPE: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_SCOPE}
28-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_REDIRECT_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_REDIRECT_URI}
29-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_AUTHORIZATION_GRANT_TYPE: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_AUTHORIZATION_GRANT_TYPE}
30-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_NAME: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_NAME}
31-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_AUTHORIZATION_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_AUTHORIZATION_URI}
32-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_TOKEN_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_TOKEN_URI}
33-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_INFO_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_INFO_URI}
34-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_NAME_ATTRIBUTE: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER_NAME_ATTRIBUTE}
35-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID}
36-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_SCOPE: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_SCOPE}
37-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_REDIRECT_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_REDIRECT_URI}
38-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_AUTHORIZATION_GRANT_TYPE: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_AUTHORIZATION_GRANT_TYPE}
39-
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_NAME: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_NAME}
40-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_AUTHORIZATION_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_AUTHORIZATION_URI}
41-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_TOKEN_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_TOKEN_URI}
42-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_INFO_URI: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_INFO_URI}
43-
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_NAME_ATTRIBUTE: ${SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KAKAO_USER_NAME_ATTRIBUTE}
44-
APPLE_CLIENT_ID: ${APPLE_CLIENT_ID}
45-
APPLE_CLIENT_SECRET: ${APPLE_CLIENT_SECRET}
46-
APPLE_LOGIN_KEY: ${APPLE_LOGIN_KEY}
47-
APPLE_TEAM_ID: ${APPLE_TEAM_ID}
48-
4913
volumes:
50-
- /home/ubuntu/OnTime-back/ontime-back/src/main/resources/application.properties:/app/src/main/resources/application.properties
14+
- /home/ubuntu/OnTime-back/ontime-back/src/main/resources/:/app/src/main/resources/
5115
- /home/ubuntu/OnTime-back/ontime-back/src/main/resources/key/:/app/resources/key/
16+
5217
depends_on:
5318
- mysql # mysql 서비스가 실행된 이후에 backend를 실행
5419

@@ -67,5 +32,4 @@ services:
6732
volumes:
6833
- mysql_data:/var/lib/mysql # MySQL 데이터를 지속적으로 저장
6934
volumes:
70-
mysql_data: # MySQL 데이터를 저장할 볼륨 정의
71-
35+
mysql_data: # MySQL 데이터를 저장할 볼륨 정의

ontime-back/src/main/java/devkor/ontime_back/controller/ScheduleController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class ScheduleController {
4141
content = @Content(
4242
mediaType = "application/json",
4343
schema = @Schema(
44-
example = "{\n \"status\": \"success\",\n \"code\": \"200\",\n \"message\": \"OK\",\n \"data\": [\n {\n \"scheduleId\": \"123e4567-e89b-12d3-a456-426614170105\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170106\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetingss\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170455\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n "
44+
example = "{\n \"status\": \"success\",\n \"code\": \"200\",\n \"message\": \"OK\",\n \"data\": [\n {\n \"scheduleId\": \"123e4567-e89b-12d3-a456-426614170105\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170106\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetingss\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170455\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n "
4545
)
4646
)),
4747
@ApiResponse(responseCode = "4XX", description = "기간 내 스케줄을 찾을 수 없음",
@@ -78,7 +78,7 @@ public ResponseEntity<ApiResponseForm<List<ScheduleDto>>> getPeriodSchedule(Http
7878
content = @Content(
7979
mediaType = "application/json",
8080
schema = @Schema(
81-
example = "{\n \"status\": \"success\",\n \"code\": \"200\",\n \"message\": \"OK\",\n \"data\": [\n {\n \"scheduleId\": \"123e4567-e89b-12d3-a456-426614170105\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170106\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetingss\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170455\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": \"00:20:00\",\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n "
81+
example = "{\n \"status\": \"success\",\n \"code\": \"200\",\n \"message\": \"OK\",\n \"data\": [\n {\n \"scheduleId\": \"123e4567-e89b-12d3-a456-426614170105\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170106\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetingss\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n{\n\"scheduleId\": \"123e4567-e89b-12d3-a456-426614170455\",\n\"placeName\": \"My home\",\n\"scheduleName\": \"Family Meetings\",\n\"moveTime\": 20,\n\"scheduleTime\": \"2024-11-18T19:30:00\",\n\"scheduleSpareTime\": 15,\n\"scheduleNote\": \"Check project updates and next steps.\",\n\"latenessTime\": null\n },\n "
8282
)
8383
)),
8484
@ApiResponse(responseCode = "4XX", description = "스케줄을 찾을 수 없음",
@@ -134,7 +134,7 @@ public ResponseEntity<ApiResponseForm<Void>> deleteSchedule(HttpServletRequest r
134134
content = @Content(
135135
schema = @Schema(
136136
type = "object",
137-
example = "{\n \"scheduleId\": \"3fa85f64-5717-4562-b3fc-2c963f66afe5\", \n \"placeId\": \"70d460da-6a82-4c57-a285-567cdeda5670\", \n \"placeName\": \"Home\", \n \"scheduleName\": \"Party\",\n \"moveTime\": \"00:00:00\",\n \"scheduleTime\": \"2024-11-15T19:30:00\",\n \"scheduleSpareTime\": 20,\n \"scheduleNote\": \"Write a message.\",\n \"latenessTime\": 0\n }"
137+
example = "{\n \"scheduleId\": \"3fa85f64-5717-4562-b3fc-2c963f66afe5\", \n \"placeId\": \"70d460da-6a82-4c57-a285-567cdeda5670\", \n \"placeName\": \"Home\", \n \"scheduleName\": \"Party\",\n \"moveTime\": 20,\n \"scheduleTime\": \"2024-11-15T19:30:00\",\n \"scheduleSpareTime\": 20,\n \"scheduleNote\": \"Write a message.\",\n \"latenessTime\": 0\n }"
138138
)
139139
)
140140
)
@@ -160,7 +160,7 @@ public ResponseEntity<ApiResponseForm<Void>> modifySchedule(HttpServletRequest r
160160
content = @Content(
161161
schema = @Schema(
162162
type = "object",
163-
example = "{\n \"scheduleId\": \"3fa85f64-5717-4562-b3fc-2c963f66afe5\", \n \"placeId\": \"70d460da-6a82-4c57-a285-567cdeda5670\", \n \"placeName\": \"Home\", \n \"scheduleName\": \"Birthday Party\",\n \"moveTime\": \"00:00:00\",\n \"scheduleTime\": \"2024-11-15T19:30:00\",\n \"isChange\": false\n, \n \"isStarted\": false\n, \n \"scheduleSpareTime\": 20,\n \"scheduleNote\": \"Write a message.\" }"
163+
example = "{\n \"scheduleId\": \"3fa85f64-5717-4562-b3fc-2c963f66afe5\", \n \"placeId\": \"70d460da-6a82-4c57-a285-567cdeda5670\", \n \"placeName\": \"Home\", \n \"scheduleName\": \"Birthday Party\",\n \"moveTime\": 10,\n \"scheduleTime\": \"2024-11-15T19:30:00\",\n \"isChange\": false\n, \n \"isStarted\": false\n, \n \"scheduleSpareTime\": 20,\n \"scheduleNote\": \"Write a message.\" }"
164164
)
165165
)
166166
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package devkor.ontime_back.dto;
2+
3+
import devkor.ontime_back.entity.Place;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
import java.util.UUID;
8+
9+
@Getter
10+
@AllArgsConstructor
11+
public class PlaceDto {
12+
private UUID placeId;
13+
private String placeName;
14+
15+
public static PlaceDto fromEntity(Place place) {
16+
return new PlaceDto(place.getPlaceId(), place.getPlaceName());
17+
}
18+
}

ontime-back/src/main/java/devkor/ontime_back/dto/ScheduleDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@AllArgsConstructor // 모든 필드를 포함하는 생성자 추가
1616
public class ScheduleDto {
1717
private UUID scheduleId;
18-
private Place place;
18+
private PlaceDto place;
1919
private String scheduleName;
2020
private Integer moveTime;
2121
private LocalDateTime scheduleTime;

ontime-back/src/main/java/devkor/ontime_back/entity/Place.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@
55
import jakarta.persistence.GenerationType;
66
import jakarta.persistence.Id;
77
import lombok.Getter;
8-
8+
import jakarta.persistence.*;
9+
import lombok.*;
910
import java.util.UUID;
1011

1112
@Getter
1213
@Entity
14+
@NoArgsConstructor
1315
public class Place {
1416

1517
@Id
1618
private UUID placeId;
1719

1820
private String placeName;
1921

20-
public Place initPlaceName(UUID placeId, String placeName) {
22+
public Place(UUID placeId, String placeName) {
2123
this.placeId = placeId;
2224
this.placeName = placeName;
23-
return this;
2425
}
2526
}

ontime-back/src/main/java/devkor/ontime_back/entity/Schedule.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
@Table(
1818
indexes = {
1919
@Index(name = "idx_schedule_user_id", columnList = "user_id"),
20-
@Index(name = "idx_schedule_lateness_time", columnList = "latenessTime")
20+
@Index(name = "idx_schedule_lateness_time", columnList = "latenessTime"),
21+
@Index(name = "idx_schedule_time", columnList = "schedule_time")
2122
}
2223
)
2324
public class Schedule {
@@ -30,7 +31,7 @@ public class Schedule {
3031
@OnDelete(action = OnDeleteAction.CASCADE)
3132
private User user;
3233

33-
@ManyToOne
34+
@ManyToOne(fetch = FetchType.LAZY)
3435
@JoinColumn(name = "place_id")
3536
private Place place;
3637

ontime-back/src/main/java/devkor/ontime_back/repository/ScheduleRepository.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,36 @@
33

44
import devkor.ontime_back.entity.Schedule;
55
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Modifying;
67
import org.springframework.data.jpa.repository.Query;
78
import org.springframework.data.repository.query.Param;
89
import org.springframework.stereotype.Repository;
910

1011
import java.time.LocalDateTime;
1112
import java.util.List;
13+
import java.util.Optional;
1214
import java.util.UUID;
1315

1416
@Repository
1517
public interface ScheduleRepository extends JpaRepository<Schedule, UUID> {
1618

17-
List<Schedule> findAllyByUserId(Long userId);
18-
19-
void deleteById(UUID scheduleId);
20-
21-
List<Schedule> findAllByUserIdAndScheduleTimeBefore(Long userId, LocalDateTime endDate);
22-
List<Schedule> findAllByUserIdAndScheduleTimeAfter(Long userId, LocalDateTime startDate);
23-
List<Schedule> findAllByUserIdAndScheduleTimeBetween(Long userId, LocalDateTime start, LocalDateTime end);
19+
// getScheduleWithAuthorization에서 Lazy Loading으로 인해 추가 SELECT 발생 가능 -> JOIN FETCH를 사용하여 Schedule과 User를 한 번의 쿼리로 조회
20+
@Query("SELECT s FROM Schedule s JOIN FETCH s.user WHERE s.scheduleId = :scheduleId")
21+
Optional<Schedule> findByIdWithUser(@Param("scheduleId") UUID scheduleId);
22+
23+
// deleteById()는 내부적으로 findById()를 실행하여 엔티티를 로드 후 삭제 -> JPQL DELETE를 사용해 한 번의 DELETE 쿼리만 실행
24+
@Modifying
25+
@Query("DELETE FROM Schedule s WHERE s.scheduleId = :scheduleId")
26+
void deleteByScheduleId(@Param("scheduleId") UUID scheduleId);
27+
28+
@Query("SELECT s FROM Schedule s JOIN FETCH s.place WHERE s.user.id = :userId")
29+
List<Schedule> findAllByUserIdWithPlace(Long userId);
30+
@Query("SELECT s FROM Schedule s JOIN FETCH s.place WHERE s.user.id = :userId AND s.scheduleTime < :endDate")
31+
List<Schedule> findAllByUserIdAndScheduleTimeBefore(@Param("userId") Long userId, @Param("endDate") LocalDateTime endDate);
32+
@Query("SELECT s FROM Schedule s JOIN FETCH s.place WHERE s.user.id = :userId AND s.scheduleTime > :startDate")
33+
List<Schedule> findAllByUserIdAndScheduleTimeAfter(@Param("userId") Long userId, @Param("startDate") LocalDateTime startDate);
34+
@Query("SELECT s FROM Schedule s JOIN FETCH s.place WHERE s.user.id = :userId AND s.scheduleTime BETWEEN :startDate AND :endDate")
35+
List<Schedule> findAllByUserIdAndScheduleTimeBetween(@Param("userId") Long userId, @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
2436

2537
// 특정 시간 범위 내에 시작되는 약속 조회 (예: 다음 날 또는 당일 약속)
2638
@Query("SELECT s FROM Schedule s WHERE s.scheduleTime BETWEEN :start AND :end")

0 commit comments

Comments
 (0)