From e0fa20d12a1d487e4a560c8612829a38c73f5c67 Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 30 Apr 2025 16:24:37 +0900 Subject: [PATCH 1/7] =?UTF-8?q?entity=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/example/qpin/domain/scrap/entity/Scrap.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java index 00dcbfc..b29a3c7 100644 --- a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java +++ b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.*; import org.example.qpin.domain.member.entity.Member; +import org.example.qpin.domain.parking.entity.Parking; import org.example.qpin.global.common.BaseEntity; @Entity @@ -16,10 +17,11 @@ public class Scrap extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scrapId; - @Column(length = 20, nullable = false) - private String parkId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parking_id") + private Parking parkingId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") - private Member member; + private Member memberId; } From ad99c4ece9f6c422a90cbfbad4b1a80066d9293e Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 30 Apr 2025 17:31:20 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EA=B1=B0=EB=A6=AC=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A7=81(=EA=B2=80=EC=83=89)=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parking/controller/ParkingController.java | 19 ++--- .../parking/dto/ParkingSearchReqDto.java | 13 ++-- .../parking/dto/ParkingSearchResDto.java | 28 +++---- .../qpin/domain/parking/entity/Parking.java | 12 +-- .../parking/service/ParkingService.java | 78 +++++++++++++------ .../global/common/response/ResponseCode.java | 9 ++- .../example/qpin/serviceTest/serviceTest.java | 15 ++-- 7 files changed, 98 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java index fc57131..e2dab05 100644 --- a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java +++ b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java @@ -19,23 +19,24 @@ public class ParkingController { private final ParkingService parkingService; - /** - * 주변 주차장 정보 탐색 - */ + // [Get] 주변 주차장 검색 @GetMapping("/parking/selectList") - public ResponseEntity> findParkingNearby(@RequestBody ParkingSearchReqDto parkingSearchReqDto) throws ParseException { + public ResponseEntity>> findParkingNearby(@RequestBody ParkingSearchReqDto parkingSearchReqDto) throws ParseException { - double latitude=parkingSearchReqDto.getLatitude(); - double longitude=parkingSearchReqDto.getLongtitude(); - double distance=parkingSearchReqDto.getDistance(); + Double latitude=parkingSearchReqDto.getLatitude(); + Double longitude=parkingSearchReqDto.getLongitude(); + Double distance=parkingSearchReqDto.getDistance(); String regionCode=parkingSearchReqDto.getRegionCode(); - return ResponseEntity.status(HttpStatus.OK).body(parkingService.findParkingNearby(latitude, longitude, distance,regionCode )); + + CommonResponse> response = parkingService.findParkingNearby(latitude, longitude, distance, regionCode); + + return ResponseEntity.status(HttpStatus.OK).body(response); } // [Post] 주차하기 버튼 @PostMapping("/parking/{parkingAreaId}/{memberId}") @ResponseBody - public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { + public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { parkingService.postParking(memberId, parkingAreaId); return new CommonResponse<>(ResponseCode.SUCCESS); } diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java index c9fc228..7b3b074 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchReqDto.java @@ -2,15 +2,14 @@ import lombok.Builder; import lombok.Getter; -import lombok.Setter; @Getter -@Setter @Builder +// 주차장 검색 요청 public class ParkingSearchReqDto { - private double latitude; - private double longtitude; - private double distance; - private String regionCode; //지역코드 5자리 문자열 + private Double latitude; // 위도 + private Double longitude; // 경도 + private Double distance; // 검색 기준 거리 + private String regionCode; // 지역코드 5자리 문자열 -} +} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java index 2bd99c6..400a55a 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingSearchResDto.java @@ -7,21 +7,21 @@ @Builder @NoArgsConstructor @AllArgsConstructor +// 주차장 검색 응답 public class ParkingSearchResDto { + private Double longitude; // 경도 + private Double latitude; // 위도 + private String address; // 도로명주소 + private String name; // 주차장명 + private String price; // 가격 + private Long parkId; //주차장 아이디 + private Double parkingDistance; // 현위치와의 거리 - private double longtitude; //경도 - private double latitude; //위도 - private String address; //도로명주소 - private String name; //주차장명 - private String price; //무료,유료 - private Long parkId; - private double parkingDistance; - - private String weekStartTime; - private String weekEndTime; - private String SaturdayStartTime; - private String SaturdayEndTime; - private String HolidayStartTime; - private String HolidayEndTime; + private String weekStartTime; // 평일 오픈 + private String weekEndTime; // 평일 마감 + private String SaturdayStartTime; // 토요일 오픈 + private String SaturdayEndTime; // 토요일 마감 + private String HolidayStartTime; // 공휴일/일요일 오픈 + private String HolidayEndTime; // 공휴일/일요일 마감 } diff --git a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java index f631966..79269fe 100644 --- a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java +++ b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java @@ -2,7 +2,6 @@ import jakarta.persistence.*; import lombok.*; -import org.example.qpin.domain.member.entity.Member; import org.example.qpin.global.common.BaseEntity; @Entity @@ -14,13 +13,8 @@ public class Parking extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long parkingId; + private Long parkingAreaId; @Column(length = 50, nullable = false) - private String parkingAreaId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; - -} + private String type; +} \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java index 710fd9d..d5f851f 100644 --- a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java +++ b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java @@ -9,6 +9,8 @@ import org.example.qpin.global.common.repository.MemberRepository; import org.example.qpin.global.common.repository.ParkingRepository; import org.example.qpin.global.common.repository.ScrapRepository; +import org.example.qpin.global.common.response.CommonResponse; +import org.example.qpin.global.common.response.ResponseCode; import org.example.qpin.global.exception.BadRequestException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -38,16 +40,21 @@ public Member findMemberById(Long memberId) { return memberRepository.findById(memberId).orElseThrow(); } - //latitude: 위도, longtitude: 경도 + //latitude: 위도, longitude: 경도 - /** - * 위도와 경도, 거리, 지역 코드를 입력하면 + /* + * 위도, 경도, 거리, 지역 코드를 입력하면 * 해당 위치로부터 입력한 거리 이내의 주차장의 정보를 반환함. */ - public List findParkingNearby(double mylatitude, double mylongtitude, double distance, String regionCode) throws ParseException { + public CommonResponse> findParkingNearby(Double mylatitude, Double mylongitude, Double distance, String regionCode) throws ParseException { + if (mylatitude == null || mylongitude == null || distance == null || regionCode == null) { + return new CommonResponse<>(ResponseCode.NOTFOUND); + } + + // 공공포털에서 데이터 가져오기 final int page=1; final int perPage=150; - final String DECODING_KEY="yncOh3M5FtqbW1UwmQmkBKpkkyYqZMj1FddwHcalnFzVCFtnlwkDOhRPFHkhnJPRKYy4scMVfbJMxn954Ym/Eg=="; //키 암호화 필요 + final String DECODING_KEY="yncOh3M5FtqbW1UwmQmkBKpkkyYqZMj1FddwHcalnFzVCFtnlwkDOhRPFHkhnJPRKYy4scMVfbJMxn954Ym/Eg=="; // 키 암호화 필요 final String API_URL="https://api.odcloud.kr/api/15050093/v1/uddi:d19c8e21-4445-43fe-b2a6-865dff832e08?" +"page=" + page +"&perPage=" + perPage @@ -63,35 +70,55 @@ public List findParkingNearby(double mylatitude, double myl .baseUrl(API_URL) .build(); - String response=webClient.get() - .retrieve() - .bodyToMono(String.class) - .block(); + String response; + try { + response = webClient.get() + .retrieve() + .bodyToMono(String.class) + .block(); + } catch (Exception e) { + // 서버 연결 실패 + return new CommonResponse<>(ResponseCode.FAILED); + } + + JSONParser jsonParser = new JSONParser(); + JSONObject jsonObject; + JSONArray dataList; - JSONParser jsonParser=new JSONParser(); - JSONObject jsonObject=(JSONObject) jsonParser.parse(response); //예외처리? - JSONArray dataList=(JSONArray) jsonObject.get("data"); + try { + jsonObject = (JSONObject) jsonParser.parse(response); + dataList = (JSONArray) jsonObject.get("data"); + } catch (Exception e) { + // JSON 파싱 오류 시 500번대 에러 반환 + return new CommonResponse<>(ResponseCode.FAILED); + } + + // 데이터가 없으면 빈 리스트로 반환 + if (dataList == null || dataList.isEmpty()) { + return new CommonResponse<>(ResponseCode.SUCCESS, new ArrayList<>()); + } List parkingSearchResDtoList =new ArrayList<>(); for(int i=0; i=parkingDistance){ ParkingSearchResDto parkingSearchResDto = new ParkingSearchResDto().builder() .latitude(latitude) - .longtitude(longtitude) - .parkId(Long.parseLong((String) data.get("주차장관리번호"))) + .longitude(longitude) + .parkId(Long.parseLong((String) data.get("주차장번호"))) .name((String) data.get("주차장명")) .address((String) data.get("주차장도로명주소")) .price((String) data.get("요금정보")) - .parkingDistance(parkingDistance) + .parkingDistance((Double) data.get("현위치와의 거리")) + .weekStartTime((String) data.get("평일운영시작시각")) .weekEndTime((String) data.get("평일운영종료시각")) .SaturdayStartTime((String) data.get("토요일운영시작시각")) @@ -103,12 +130,11 @@ public List findParkingNearby(double mylatitude, double myl } } - return parkingSearchResDtoList; - + return new CommonResponse<>(ResponseCode.SUCCESS, parkingSearchResDtoList); } // 두 좌표 사이의 거리를 구하는 함수 - // dsitance(첫번쨰 좌표의 위도, 첫번째 좌표의 경도, 두번째 좌표의 위도, 두번째 좌표의 경도) + // dsitance(첫번째 좌표의 위도, 첫번째 좌표의 경도, 두번째 좌표의 위도, 두번째 좌표의 경도) private static double distance(double lat1, double lon1, double lat2, double lon2){ double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1))* Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1))*Math.cos(deg2rad(lat2))*Math.cos(deg2rad(theta)); @@ -123,17 +149,17 @@ private static double distance(double lat1, double lon1, double lat2, double lon private static double deg2rad(double deg){ return (deg * Math.PI/180.0); } + //radian(라디안)을 10진수로 변환 private static double rad2deg(double rad){ return (rad * 180 / Math.PI); } - - public void postParking(Long memberId, String parkingAreaId) { + // 주차 등록하기 + public void postParking(Long memberId, Long parkingAreaId) { Member member = findMemberById(memberId); Parking newParking = Parking.builder() - .member(member) .parkingAreaId(parkingAreaId) .build(); @@ -141,6 +167,7 @@ public void postParking(Long memberId, String parkingAreaId) { return; } + // 주차 삭제하기 public void deleteParking(Long memberId, String parkingAreaId) { Member member = findMemberById(memberId); @@ -151,6 +178,7 @@ public void deleteParking(Long memberId, String parkingAreaId) { return; } + // 현재 주차된 주차장 정보 불러오기 public ParkingInfoResDto getParkingInfo(Long memberId, String parkingAreaId) { Member member = findMemberById(memberId); diff --git a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java index 887c245..023cd85 100644 --- a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java +++ b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java @@ -5,15 +5,16 @@ @Getter public enum ResponseCode { /* - 2000번대 : 성공 관련 + 200번대 : 성공 관련 */ - SUCCESS(2000, true, "요청에 성공하였습니다."); + SUCCESS(200, true, "요청에 성공하였습니다."), + NOTFOUND(400, false, "요청값이 잘못됐습니다."), + FAILED(500, false, "서버에러. 요청에 실패하였습니다."); private int code; private boolean inSuccess; private String message; - /* 해당되는 코드 매핑 @param code @@ -26,4 +27,4 @@ public enum ResponseCode { this.code = code; this.message = message; } -} +} \ No newline at end of file diff --git a/src/test/java/org/example/qpin/serviceTest/serviceTest.java b/src/test/java/org/example/qpin/serviceTest/serviceTest.java index e9159db..7ecc0ac 100644 --- a/src/test/java/org/example/qpin/serviceTest/serviceTest.java +++ b/src/test/java/org/example/qpin/serviceTest/serviceTest.java @@ -4,21 +4,20 @@ import org.example.qpin.global.common.repository.ParkingRepository; import org.json.simple.parser.ParseException; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.mockito.InjectMocks; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; @SpringBootTest public class serviceTest { + @MockBean + private ParkingRepository parkingRepository; - private final ParkingService parkingService; - - @Autowired - serviceTest(ParkingRepository parkingRepository){ - parkingService=new ParkingService(parkingRepository); - } + @InjectMocks + private ParkingService parkingService; @Test public void 주변주차장찾기() throws ParseException { - System.out.println(parkingService.findParkingNearby(35.4816746,129.4085415,10, "11110")); + System.out.println(parkingService.findParkingNearby(35.4816746,129.4085415, 10.0, "11110")); } } From 4085ddd01da6f7c38688cc729bb3d3b7dcb241c1 Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 30 Apr 2025 18:36:36 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parking/controller/ParkingController.java | 27 +++--- .../parking/service/ParkingService.java | 86 +++++++++---------- .../common/repository/ParkingRepository.java | 3 +- .../common/repository/ScrapRepository.java | 4 +- .../global/common/response/ResponseCode.java | 6 +- .../qpin/global/exception/ExceptionCode.java | 1 + 6 files changed, 57 insertions(+), 70 deletions(-) diff --git a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java index e2dab05..ecbb434 100644 --- a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java +++ b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java @@ -1,14 +1,13 @@ package org.example.qpin.domain.parking.controller; import lombok.RequiredArgsConstructor; +import org.example.qpin.domain.parking.dto.ParkingInfoResDto; import org.example.qpin.domain.parking.dto.ParkingSearchReqDto; import org.example.qpin.domain.parking.dto.ParkingSearchResDto; import org.example.qpin.domain.parking.service.ParkingService; import org.example.qpin.global.common.response.CommonResponse; import org.example.qpin.global.common.response.ResponseCode; import org.json.simple.parser.ParseException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -21,37 +20,35 @@ public class ParkingController { // [Get] 주변 주차장 검색 @GetMapping("/parking/selectList") - public ResponseEntity>> findParkingNearby(@RequestBody ParkingSearchReqDto parkingSearchReqDto) throws ParseException { + public CommonResponse> findParkingNearby(@RequestParam ParkingSearchReqDto parkingSearchReqDto) throws ParseException { Double latitude=parkingSearchReqDto.getLatitude(); Double longitude=parkingSearchReqDto.getLongitude(); Double distance=parkingSearchReqDto.getDistance(); String regionCode=parkingSearchReqDto.getRegionCode(); - CommonResponse> response = parkingService.findParkingNearby(latitude, longitude, distance, regionCode); - - return ResponseEntity.status(HttpStatus.OK).body(response); + List parkingList = parkingService.findParkingNearby(latitude, longitude, distance, regionCode); + return new CommonResponse<>(ResponseCode.SUCCESS, parkingList); } - // [Post] 주차하기 버튼 + // [Post] 주차 등록 @PostMapping("/parking/{parkingAreaId}/{memberId}") - @ResponseBody - public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { + public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { parkingService.postParking(memberId, parkingAreaId); - return new CommonResponse<>(ResponseCode.SUCCESS); + return new CommonResponse<>(ResponseCode.SUCCESS, "주차가 완료되었습니다."); } - // [Delete] 주차하기 버튼 해제 + // [Delete] 주차 해제 @DeleteMapping("/parking/{parkingAreaId}/{memberId}") @ResponseBody - public CommonResponse deleteParking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { + public CommonResponse deleteParking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { parkingService.deleteParking(memberId, parkingAreaId); - return new CommonResponse<>(ResponseCode.SUCCESS); + return new CommonResponse<>(ResponseCode.SUCCESS, "주차 해제가 완료되었습니다."); } - // [Get] 간편 주차 주차장 정보 + // [Get] 현재 주차한 주차장 정보 @GetMapping("/parking/select/{parkingAreaId}/{memberId}") - public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") String parkingAreaId) { + public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { return new CommonResponse<>(ResponseCode.SUCCESS, parkingService.getParkingInfo(memberId, parkingAreaId)); } } diff --git a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java index d5f851f..47c1af7 100644 --- a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java +++ b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java @@ -1,17 +1,14 @@ package org.example.qpin.domain.parking.service; import lombok.RequiredArgsConstructor; -import org.example.qpin.domain.member.entity.Member; import org.example.qpin.domain.parking.dto.ParkingInfoResDto; import org.example.qpin.domain.parking.dto.ParkingSearchResDto; import org.example.qpin.domain.parking.entity.Parking; -import org.example.qpin.domain.scrap.entity.Scrap; import org.example.qpin.global.common.repository.MemberRepository; import org.example.qpin.global.common.repository.ParkingRepository; import org.example.qpin.global.common.repository.ScrapRepository; -import org.example.qpin.global.common.response.CommonResponse; -import org.example.qpin.global.common.response.ResponseCode; import org.example.qpin.global.exception.BadRequestException; +import org.example.qpin.global.exception.ExceptionCode; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -26,8 +23,6 @@ import java.util.List; import java.util.Optional; -import static org.example.qpin.global.exception.ExceptionCode.NOT_FOUND_PARKING; - @Service @RequiredArgsConstructor public class ParkingService { @@ -36,8 +31,12 @@ public class ParkingService { private final MemberRepository memberRepository; private final ScrapRepository scrapRepository; - public Member findMemberById(Long memberId) { - return memberRepository.findById(memberId).orElseThrow(); + public void findMemberById(Long memberId) { + memberRepository.findById(memberId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_MEMBER_ID)); + } + + public void findParkingById(Long parkingAreaId) { + parkingRepository.findById(parkingAreaId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); } //latitude: 위도, longitude: 경도 @@ -46,9 +45,9 @@ public Member findMemberById(Long memberId) { * 위도, 경도, 거리, 지역 코드를 입력하면 * 해당 위치로부터 입력한 거리 이내의 주차장의 정보를 반환함. */ - public CommonResponse> findParkingNearby(Double mylatitude, Double mylongitude, Double distance, String regionCode) throws ParseException { - if (mylatitude == null || mylongitude == null || distance == null || regionCode == null) { - return new CommonResponse<>(ResponseCode.NOTFOUND); + public List findParkingNearby(Double myLatitude, Double myLongitude, Double distance, String regionCode) throws ParseException { + if (myLatitude == null || myLongitude == null || distance == null || regionCode == null) { + throw new BadRequestException(ExceptionCode.NOT_FOUND); } // 공공포털에서 데이터 가져오기 @@ -78,7 +77,7 @@ public CommonResponse> findParkingNearby(Double mylati .block(); } catch (Exception e) { // 서버 연결 실패 - return new CommonResponse<>(ResponseCode.FAILED); + throw new BadRequestException(ExceptionCode.INTERNAL_SEVER_ERROR); } @@ -91,26 +90,26 @@ public CommonResponse> findParkingNearby(Double mylati dataList = (JSONArray) jsonObject.get("data"); } catch (Exception e) { // JSON 파싱 오류 시 500번대 에러 반환 - return new CommonResponse<>(ResponseCode.FAILED); + throw new BadRequestException(ExceptionCode.INTERNAL_SEVER_ERROR); } // 데이터가 없으면 빈 리스트로 반환 if (dataList == null || dataList.isEmpty()) { - return new CommonResponse<>(ResponseCode.SUCCESS, new ArrayList<>()); + return new ArrayList<>(); } List parkingSearchResDtoList =new ArrayList<>(); - for(int i=0; i=parkingDistance){ - ParkingSearchResDto parkingSearchResDto = new ParkingSearchResDto().builder() + double parkingDistance = distance(myLatitude, myLongitude, latitude, longitude); + if(distance>=parkingDistance) { + ParkingSearchResDto parkingSearchResDto = ParkingSearchResDto.builder() .latitude(latitude) .longitude(longitude) .parkId(Long.parseLong((String) data.get("주차장번호"))) @@ -130,7 +129,7 @@ public CommonResponse> findParkingNearby(Double mylati } } - return new CommonResponse<>(ResponseCode.SUCCESS, parkingSearchResDtoList); + return parkingSearchResDtoList; } // 두 좌표 사이의 거리를 구하는 함수 @@ -155,58 +154,51 @@ private static double rad2deg(double rad){ return (rad * 180 / Math.PI); } + + // 주차 등록하기 public void postParking(Long memberId, Long parkingAreaId) { - Member member = findMemberById(memberId); + findMemberById(memberId); + findParkingById(parkingAreaId); Parking newParking = Parking.builder() .parkingAreaId(parkingAreaId) .build(); parkingRepository.save(newParking); - return; } // 주차 삭제하기 - public void deleteParking(Long memberId, String parkingAreaId) { - Member member = findMemberById(memberId); + public void deleteParking(Long memberId, Long parkingAreaId) { + findMemberById(memberId); + findParkingById(parkingAreaId); - Parking parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, member) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PARKING)); + Parking parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId) + .orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); parkingRepository.delete(parking); - return; } // 현재 주차된 주차장 정보 불러오기 - public ParkingInfoResDto getParkingInfo(Long memberId, String parkingAreaId) { - Member member = findMemberById(memberId); + public ParkingInfoResDto getParkingInfo(Long memberId, Long parkingAreaId) { + findMemberById(memberId); - // parkingStatus, parkingDate, parkingTime - boolean parkingStatus; - LocalDateTime parkingDate = null; - int parkingTime = 0; + boolean parkingStatus = false; // 주차 여부 + LocalDateTime parkingDate = null; // 주차 시작한 시간 + int parkingTime = 0; // 주차한 시간 - Optional parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, member); + // 주차 정보 확인 + Optional parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId); if (parking.isPresent()) { parkingStatus = true; parkingDate = parking.get().getCreatedAt(); - LocalDateTime now = LocalDateTime.now(); - Duration duration = Duration.between(parkingDate, now); - parkingTime = (int) duration.toMinutes(); // 분 단위로 반환하여 전송 - } else { - parkingStatus = false; + // 주차 시간 계산 + parkingTime = (int) Duration.between(parkingDate, LocalDateTime.now()).toMinutes(); } - // scrapStatus - boolean scrapStatus; - Optional scrap = scrapRepository.findScrapByParkIdAndMember(parkingAreaId, member); - if (scrap.isPresent()) { - scrapStatus = true; - } else { - scrapStatus = false; - } + // scrap 상태 확인 + boolean scrapStatus = scrapRepository.findScrapByParkIdAndMember(parkingAreaId, memberId).isPresent(); return ParkingInfoResDto.builder() .parkingStatus(parkingStatus) diff --git a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java index b2636a8..591104e 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java @@ -1,6 +1,5 @@ package org.example.qpin.global.common.repository; -import org.example.qpin.domain.member.entity.Member; import org.example.qpin.domain.parking.entity.Parking; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,5 +7,5 @@ public interface ParkingRepository extends JpaRepository { - Optional findParkingByParkingAreaIdAndMember(String parkingAreaId, Member member); + Optional findParkingByParkingAreaIdAndMember(Long parkingAreaId, Long memberId); } diff --git a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java index 17e55e5..99a2a58 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java @@ -1,7 +1,5 @@ package org.example.qpin.global.common.repository; -import org.example.qpin.domain.member.entity.Member; -import org.example.qpin.domain.parking.entity.Parking; import org.example.qpin.domain.scrap.entity.Scrap; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,6 +7,6 @@ public interface ScrapRepository extends JpaRepository { - Optional findScrapByParkIdAndMember(String parkId, Member member); + Optional findScrapByParkIdAndMember(Long parkId, Long member); } diff --git a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java index 023cd85..e33b7f8 100644 --- a/src/main/java/org/example/qpin/global/common/response/ResponseCode.java +++ b/src/main/java/org/example/qpin/global/common/response/ResponseCode.java @@ -7,9 +7,9 @@ public enum ResponseCode { /* 200번대 : 성공 관련 */ - SUCCESS(200, true, "요청에 성공하였습니다."), - NOTFOUND(400, false, "요청값이 잘못됐습니다."), - FAILED(500, false, "서버에러. 요청에 실패하였습니다."); + SUCCESS(2000, true, "요청에 성공하였습니다."), + NOTFOUND(4000, false, "요청값이 잘못됐습니다."), + FAILED(5000, false, "서버에러. 요청에 실패하였습니다."); private int code; private boolean inSuccess; diff --git a/src/main/java/org/example/qpin/global/exception/ExceptionCode.java b/src/main/java/org/example/qpin/global/exception/ExceptionCode.java index 0743c22..370ab6d 100644 --- a/src/main/java/org/example/qpin/global/exception/ExceptionCode.java +++ b/src/main/java/org/example/qpin/global/exception/ExceptionCode.java @@ -9,6 +9,7 @@ public enum ExceptionCode { INVALID_REQUEST(1000, "올바르지 않은 요청입니다."), + NOT_FOUND(4000, "입력한 데이터가 올바르지 않습니다."), // 멤버 에러 NOT_FOUND_MEMBER_ID(1010, "요청한 ID에 해당하는 멤버가 존재하지 않습니다."), From 5f7a0b17719d739b0129d137abc2fa80cd083f90 Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 30 Apr 2025 19:10:16 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qpin/domain/member/entity/Member.java | 10 +++++- .../parking/controller/ParkingController.java | 4 +-- .../qpin/domain/parking/entity/Parking.java | 6 ++-- .../parking/service/ParkingService.java | 36 ++++++++++++------- .../qpin/domain/scrap/entity/Scrap.java | 4 +-- .../common/repository/ScrapRepository.java | 1 - 6 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/example/qpin/domain/member/entity/Member.java b/src/main/java/org/example/qpin/domain/member/entity/Member.java index 01a47ed..f188c7f 100644 --- a/src/main/java/org/example/qpin/domain/member/entity/Member.java +++ b/src/main/java/org/example/qpin/domain/member/entity/Member.java @@ -6,7 +6,6 @@ import org.example.qpin.domain.scrap.entity.Scrap; import org.example.qpin.global.common.BaseEntity; -import java.security.Timestamp; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -69,4 +68,13 @@ public Member (String name, String password, String role){ this.role = role; // this.phoneNumber = phoneNumber; } + + // 주차 여부 + @Column(nullable = false) + private boolean isParking; + + // 주차 여부를 설정 + public void setParking(boolean isParking) { + this.isParking = isParking; + } } diff --git a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java index ecbb434..9086268 100644 --- a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java +++ b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java @@ -33,8 +33,8 @@ public CommonResponse> findParkingNearby(@RequestParam // [Post] 주차 등록 @PostMapping("/parking/{parkingAreaId}/{memberId}") - public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { - parkingService.postParking(memberId, parkingAreaId); + public CommonResponse parking(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId, @RequestBody String type) { + parkingService.postParking(memberId, parkingAreaId, type); return new CommonResponse<>(ResponseCode.SUCCESS, "주차가 완료되었습니다."); } diff --git a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java index 79269fe..c6fd300 100644 --- a/src/main/java/org/example/qpin/domain/parking/entity/Parking.java +++ b/src/main/java/org/example/qpin/domain/parking/entity/Parking.java @@ -1,6 +1,9 @@ package org.example.qpin.domain.parking.entity; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.*; import org.example.qpin.global.common.BaseEntity; @@ -15,6 +18,5 @@ public class Parking extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long parkingAreaId; - @Column(length = 50, nullable = false) private String type; } \ No newline at end of file diff --git a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java index 47c1af7..9e63551 100644 --- a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java +++ b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java @@ -1,6 +1,7 @@ package org.example.qpin.domain.parking.service; import lombok.RequiredArgsConstructor; +import org.example.qpin.domain.member.entity.Member; import org.example.qpin.domain.parking.dto.ParkingInfoResDto; import org.example.qpin.domain.parking.dto.ParkingSearchResDto; import org.example.qpin.domain.parking.entity.Parking; @@ -31,12 +32,12 @@ public class ParkingService { private final MemberRepository memberRepository; private final ScrapRepository scrapRepository; - public void findMemberById(Long memberId) { - memberRepository.findById(memberId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_MEMBER_ID)); + public Member findMemberById(Long memberId) { + return memberRepository.findById(memberId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_MEMBER_ID)); } - public void findParkingById(Long parkingAreaId) { - parkingRepository.findById(parkingAreaId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); + public Parking findParkingById(Long parkingAreaId) { + return parkingRepository.findById(parkingAreaId).orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); } //latitude: 위도, longitude: 경도 @@ -157,26 +158,37 @@ private static double rad2deg(double rad){ // 주차 등록하기 - public void postParking(Long memberId, Long parkingAreaId) { - findMemberById(memberId); - findParkingById(parkingAreaId); + public void postParking(Long memberId, Long parkingAreaId, String type) { + Member member = findMemberById(memberId); + Parking parking = findParkingById(parkingAreaId); + + // 해당 멤버가 이미 주차 중인 상태인지 확인 + if (member.isParking()) { + throw new BadRequestException(ExceptionCode.DUPLICATED_ADMIN_USERID); + } Parking newParking = Parking.builder() .parkingAreaId(parkingAreaId) + .type(type) .build(); - parkingRepository.save(newParking); + + member.setParking(true); + memberRepository.save(member); } // 주차 삭제하기 public void deleteParking(Long memberId, Long parkingAreaId) { - findMemberById(memberId); - findParkingById(parkingAreaId); + Member member = findMemberById(memberId); + Parking parking = findParkingById(parkingAreaId); - Parking parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId) + Parking parkingToDelete = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId) .orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); - parkingRepository.delete(parking); + parkingRepository.delete(parkingToDelete); + + member.setParking(false); + memberRepository.save(member); } // 현재 주차된 주차장 정보 불러오기 diff --git a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java index b29a3c7..a005e57 100644 --- a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java +++ b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java @@ -19,9 +19,9 @@ public class Scrap extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parking_id") - private Parking parkingId; + private Parking parking; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") - private Member memberId; + private Member member; } diff --git a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java index 99a2a58..c495a15 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ScrapRepository.java @@ -8,5 +8,4 @@ public interface ScrapRepository extends JpaRepository { Optional findScrapByParkIdAndMember(Long parkId, Long member); - } From 96fde4a0f8980fd5eaa094bdc48f91ed6c0ef394 Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 30 Apr 2025 19:22:34 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=B0=A8=EC=9E=A5=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parking/controller/ParkingController.java | 6 ++-- .../domain/parking/dto/ParkingInfoResDto.java | 9 +++-- .../parking/service/ParkingService.java | 34 ++++++++----------- .../common/repository/ParkingRepository.java | 1 + 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java index 9086268..73c2bc2 100644 --- a/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java +++ b/src/main/java/org/example/qpin/domain/parking/controller/ParkingController.java @@ -47,8 +47,8 @@ public CommonResponse deleteParking(@PathVariable("memberId") Long membe } // [Get] 현재 주차한 주차장 정보 - @GetMapping("/parking/select/{parkingAreaId}/{memberId}") - public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId, @PathVariable("parkingAreaId") Long parkingAreaId) { - return new CommonResponse<>(ResponseCode.SUCCESS, parkingService.getParkingInfo(memberId, parkingAreaId)); + @GetMapping("/parking/select/{memberId}") + public CommonResponse parkingInfo(@PathVariable("memberId") Long memberId) { + return new CommonResponse<>(ResponseCode.SUCCESS, parkingService.getParkingInfo(memberId)); } } diff --git a/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java b/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java index a083396..5f5442d 100644 --- a/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java +++ b/src/main/java/org/example/qpin/domain/parking/dto/ParkingInfoResDto.java @@ -13,9 +13,8 @@ @Builder public class ParkingInfoResDto { - private boolean parkingStatus; - private boolean scrapStatus; - private LocalDateTime parkingDate; - private int parkingTime; - + private LocalDateTime parkingDate; // 주차 시작 시간 + private int parkingTime; // 주차한 시간(분 단위) + private Long parkingAreaId; // 주차장 ID + private String parkingType; // 주차장 유형 } diff --git a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java index 9e63551..2be2124 100644 --- a/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java +++ b/src/main/java/org/example/qpin/domain/parking/service/ParkingService.java @@ -22,7 +22,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -192,31 +191,28 @@ public void deleteParking(Long memberId, Long parkingAreaId) { } // 현재 주차된 주차장 정보 불러오기 - public ParkingInfoResDto getParkingInfo(Long memberId, Long parkingAreaId) { - findMemberById(memberId); - - boolean parkingStatus = false; // 주차 여부 - LocalDateTime parkingDate = null; // 주차 시작한 시간 - int parkingTime = 0; // 주차한 시간 - - // 주차 정보 확인 - Optional parking = parkingRepository.findParkingByParkingAreaIdAndMember(parkingAreaId, memberId); - if (parking.isPresent()) { - parkingStatus = true; - parkingDate = parking.get().getCreatedAt(); + public ParkingInfoResDto getParkingInfo(Long memberId) { + Member member = findMemberById(memberId); - // 주차 시간 계산 - parkingTime = (int) Duration.between(parkingDate, LocalDateTime.now()).toMinutes(); + // 멤버가 주차 중인 상태인지를 확인 + if (!member.isParking()) { + throw new BadRequestException(ExceptionCode.NOT_FOUND_PARKING); } - // scrap 상태 확인 - boolean scrapStatus = scrapRepository.findScrapByParkIdAndMember(parkingAreaId, memberId).isPresent(); + // 멤버가 주차 중인 주차장 정보를 가져옴 + Parking parking = parkingRepository.findParkingByMemberIdAndIsParkingTrue(memberId) + .orElseThrow(() -> new BadRequestException(ExceptionCode.NOT_FOUND_PARKING)); + + // 주차 시작 시간 및 기타 정보를 가져옴 + LocalDateTime parkingDate = parking.getCreatedAt(); + int parkingTime = (int) Duration.between(parkingDate, LocalDateTime.now()).toMinutes(); + // 주차장 정보 반환 return ParkingInfoResDto.builder() - .parkingStatus(parkingStatus) - .scrapStatus(scrapStatus) .parkingDate(parkingDate) .parkingTime(parkingTime) + .parkingAreaId(parking.getParkingAreaId()) + .parkingType(parking.getType()) .build(); } diff --git a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java index 591104e..dec5016 100644 --- a/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java +++ b/src/main/java/org/example/qpin/global/common/repository/ParkingRepository.java @@ -8,4 +8,5 @@ public interface ParkingRepository extends JpaRepository { Optional findParkingByParkingAreaIdAndMember(Long parkingAreaId, Long memberId); + Optional findParkingByMemberIdAndIsParkingTrue(Long memberId); } From 3376b8fda4dc88c03f73ef7d504d2420b1ea9a6e Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 7 May 2025 15:55:34 +0900 Subject: [PATCH 6/7] =?UTF-8?q?CD=20=EC=8B=A4=ED=96=89=20=EC=A4=91?= =?UTF-8?q?=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/github-actions.yml | 125 ++++++++++++++------------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 30eb8a1..b6fb8ef 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -53,65 +53,66 @@ jobs: - name: Publish image to docker hub run: docker push ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest - deploy: - needs: build - runs-on: ubuntu-latest - steps: - - name: Set Target IP - run: | - STATUS=$(curl -o /dev/null -w "%{http_code}" "http://${{ secrets.QPIN_SERVER_IP }}/env") - echo $STATUS - if [ $STATUS = 200 ]; then - CURRENT_UPSTREAM=$(curl -s "http://${{ secrets.QPIN_SERVER_IP }}/env") - else - CURRENT_UPSTREAM=green - fi - echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV - if [ $CURRENT_UPSTREAM = blue ]; then - echo "CURRENT_PORT=8080" >> $GITHUB_ENV - echo "STOPPED_PORT=8081" >> $GITHUB_ENV - echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV - else - echo "CURRENT_PORT=8081" >> $GITHUB_ENV - echo "STOPPED_PORT=8080" >> $GITHUB_ENV - echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV - fi - - - name: Docker Compose - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker pull ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest - sudo docker-compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d - - - name: Check deploy server URL - uses: jtalk/url-health-check-action@v3 - with: - url: http://${{ secrets.QPIN_SERVER_IP }}:${{ env.STOPPED_PORT }}/env - max-attempts: 5 - retry-delay: 10s - - - name: Change nginx upstream - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker exec -i nginxserver bash -c 'echo "set \$service_url ${{env.TARGET_UPSTREAM}};" > etc/nginx/conf.d/service-env.inc && nginx -s reload' - - - name: Stop current server - uses: appleboy/ssh-action@master - with: - username: ubuntu - host: ${{ secrets.QPIN_SERVER_IP }} - key: ${{ secrets.EC2_SSH_KEY }} - script_stop: true - script: | - sudo docker stop ${{ env.CURRENT_UPSTREAM }} - sudo docker rm ${{ env.CURRENT_UPSTREAM }} \ No newline at end of file +# CD 임시 삭제 +# deploy: +# needs: build +# runs-on: ubuntu-latest +# steps: +# - name: Set Target IP +# run: | +# STATUS=$(curl -o /dev/null -w "%{http_code}" "http://${{ secrets.QPIN_SERVER_IP }}/env") +# echo $STATUS +# if [ $STATUS = 200 ]; then +# CURRENT_UPSTREAM=$(curl -s "http://${{ secrets.QPIN_SERVER_IP }}/env") +# else +# CURRENT_UPSTREAM=green +# fi +# echo CURRENT_UPSTREAM=$CURRENT_UPSTREAM >> $GITHUB_ENV +# if [ $CURRENT_UPSTREAM = blue ]; then +# echo "CURRENT_PORT=8080" >> $GITHUB_ENV +# echo "STOPPED_PORT=8081" >> $GITHUB_ENV +# echo "TARGET_UPSTREAM=green" >> $GITHUB_ENV +# else +# echo "CURRENT_PORT=8081" >> $GITHUB_ENV +# echo "STOPPED_PORT=8080" >> $GITHUB_ENV +# echo "TARGET_UPSTREAM=blue" >> $GITHUB_ENV +# fi +# +# - name: Docker Compose +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker pull ${{ secrets.DOCKER_USERNAME }}/qpin_server:latest +# sudo docker-compose -f docker-compose-${{env.TARGET_UPSTREAM}}.yml up -d +# +# - name: Check deploy server URL +# uses: jtalk/url-health-check-action@v3 +# with: +# url: http://${{ secrets.QPIN_SERVER_IP }}:${{ env.STOPPED_PORT }}/env +# max-attempts: 5 +# retry-delay: 10s +# +# - name: Change nginx upstream +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker exec -i nginxserver bash -c 'echo "set \$service_url ${{env.TARGET_UPSTREAM}};" > etc/nginx/conf.d/service-env.inc && nginx -s reload' +# +# - name: Stop current server +# uses: appleboy/ssh-action@master +# with: +# username: ubuntu +# host: ${{ secrets.QPIN_SERVER_IP }} +# key: ${{ secrets.EC2_SSH_KEY }} +# script_stop: true +# script: | +# sudo docker stop ${{ env.CURRENT_UPSTREAM }} +# sudo docker rm ${{ env.CURRENT_UPSTREAM }} \ No newline at end of file From 8d994d1e9b443d188336218f8396c486eda65f83 Mon Sep 17 00:00:00 2001 From: KIMMINJI Date: Wed, 7 May 2025 15:55:53 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20=EC=A1=B0=EC=A0=95(CI=20=EC=9C=84=ED=95=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java index a005e57..c022d9f 100644 --- a/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java +++ b/src/main/java/org/example/qpin/domain/scrap/entity/Scrap.java @@ -21,6 +21,9 @@ public class Scrap extends BaseEntity { @JoinColumn(name = "parking_id") private Parking parking; + @Column(name = "parking_id") + private String parkId; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member;