Skip to content

Commit

Permalink
[#56] Hexagonal Architecture 로 변경 (#63)
Browse files Browse the repository at this point in the history
* feat: p6spy 적용

* refactor: mvc 아키텍처 -> 헥사고날 아키텍처 리팩토링

* feat: application.yml의 db 정보 수정

* feat: profile에 따른 설정 파일 참조되도록 개발
  • Loading branch information
DevKTak committed Jun 27, 2023
1 parent f3fea07 commit f4688b9
Show file tree
Hide file tree
Showing 67 changed files with 457 additions and 318 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ repositories {
dependencies {
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
implementation 'com.auth0:java-jwt:4.4.0'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
implementation 'com.github.iamport:iamport-rest-client-java:0.2.22'
implementation 'com.github.javafaker:javafaker:1.0.2'
implementation 'com.h2database:h2:2.1.214'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import com.hotelJava.accommodation.application.port.DeleteAccommodationUseCase;
import com.hotelJava.accommodation.application.port.FindAccommodationQuery;
import com.hotelJava.accommodation.application.port.SaveAccommodationUseCase;
import com.hotelJava.accommodation.application.port.CreateAccommodationUseCase;
import com.hotelJava.accommodation.application.port.UpdateAccommodationUseCase;
import com.hotelJava.accommodation.domain.AccommodationType;
import com.hotelJava.accommodation.dto.CreateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationResponseDto;
import com.hotelJava.accommodation.dto.FindAccommodationResponseDto;
import com.hotelJava.accommodation.dto.UpdateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationRequest;
import com.hotelJava.accommodation.dto.CreateAccommodationResponse;
import com.hotelJava.accommodation.dto.FindAccommodationResponse;
import com.hotelJava.accommodation.dto.UpdateAccommodationRequest;
import com.hotelJava.common.dto.DecodeId;
import com.hotelJava.member.domain.Role;
import jakarta.validation.Valid;
Expand All @@ -34,7 +34,7 @@
@RequestMapping("/api/accommodations")
public class AccommodationController {

private final SaveAccommodationUseCase saveAccommodationUseCase;
private final CreateAccommodationUseCase createAccommodationUseCase;

private final FindAccommodationQuery findAccommodationQuery;

Expand All @@ -43,7 +43,7 @@ public class AccommodationController {
private final DeleteAccommodationUseCase deleteAccommodationUseCase;

@GetMapping("/{type}/{firstLocation}/{secondLocation}")
public List<FindAccommodationResponseDto> findAccommodations(
public List<FindAccommodationResponse> findAccommodations(
@PathVariable(name = "type", required = true) AccommodationType type,
@PathVariable(name = "firstLocation", required = true) String firstLocation,
@PathVariable(name = "secondLocation", required = true) String secondLocation,
Expand All @@ -66,17 +66,17 @@ public List<FindAccommodationResponseDto> findAccommodations(
}

@PostMapping
public CreateAccommodationResponseDto createAccommodation(
@Valid @RequestBody CreateAccommodationRequestDto createAccommodationRequestDto) {
return saveAccommodationUseCase.saveAccommodation(createAccommodationRequestDto);
public CreateAccommodationResponse createAccommodation(
@Valid @RequestBody CreateAccommodationRequest createAccommodationRequest) {
return createAccommodationUseCase.createAccommodation(createAccommodationRequest);
}

@PutMapping("/{encodedAccommodationId}")
public HttpStatus updateAccommodation(
@PathVariable("encodedAccommodationId") DecodeId accommodationId,
@Valid @RequestBody UpdateAccommodationRequestDto updateAccommodationRequestDto) {
@Valid @RequestBody UpdateAccommodationRequest updateAccommodationRequest) {
updateAccommodationUseCase.updateAccommodation(
accommodationId.getDecodeId(), updateAccommodationRequestDto);
accommodationId.getDecodeId(), updateAccommodationRequest);

return HttpStatus.OK;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.hotelJava.accommodation.application.port;

import com.hotelJava.accommodation.dto.CreateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationResponseDto;
import com.hotelJava.accommodation.dto.CreateAccommodationRequest;
import com.hotelJava.accommodation.dto.CreateAccommodationResponse;

public interface SaveAccommodationUseCase {
public interface CreateAccommodationUseCase {

CreateAccommodationResponseDto saveAccommodation(CreateAccommodationRequestDto command);
CreateAccommodationResponse createAccommodation(CreateAccommodationRequest command);
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.hotelJava.accommodation.application.port;

import com.hotelJava.accommodation.domain.AccommodationType;
import com.hotelJava.accommodation.dto.FindAccommodationResponseDto;
import com.hotelJava.accommodation.dto.FindAccommodationResponse;
import com.hotelJava.member.domain.Role;
import java.time.LocalDate;
import java.util.List;

public interface FindAccommodationQuery {

List<FindAccommodationResponseDto> findAccommodations(
List<FindAccommodationResponse> findAccommodations(
AccommodationType type,
String firstLocation,
String secondLocation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.hotelJava.accommodation.application.port;

import com.hotelJava.accommodation.dto.UpdateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.UpdateAccommodationRequest;

public interface UpdateAccommodationUseCase {

void updateAccommodation(
Long accommodationId, UpdateAccommodationRequestDto updateAccommodationRequestDto);
Long accommodationId, UpdateAccommodationRequest updateAccommodationRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.hotelJava.accommodation.application.port.FindAccommodationQuery;
import com.hotelJava.accommodation.domain.Accommodation;
import com.hotelJava.accommodation.domain.AccommodationType;
import com.hotelJava.accommodation.dto.FindAccommodationResponseDto;
import com.hotelJava.accommodation.dto.FindAccommodationResponse;
import com.hotelJava.accommodation.util.AccommodationMapper;
import com.hotelJava.common.error.ErrorCode;
import com.hotelJava.common.error.exception.InternalServerException;
Expand All @@ -21,14 +21,14 @@
@Transactional(readOnly = true)
@Service
@RequiredArgsConstructor
public class AccommodationSearchService implements FindAccommodationQuery {
public class AccommodationFindService implements FindAccommodationQuery {

private final AccommodationRepository accommodationRepository;

private final AccommodationMapper accommodationMapper;

@Override
public List<FindAccommodationResponseDto> findAccommodations(
public List<FindAccommodationResponse> findAccommodations(
AccommodationType type,
String firstLocation,
String secondLocation,
Expand All @@ -51,7 +51,7 @@ public List<FindAccommodationResponseDto> findAccommodations(
.min()
.orElseThrow(
() -> new InternalServerException(ErrorCode.NO_MINIMUM_PRICE_FOUND));
return accommodationMapper.toFindAccommodationResponseDto(
return accommodationMapper.toFindAccommodationResponse(
minimumRoomPrice, accommodation);
})
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import com.hotelJava.accommodation.adapter.persistence.AccommodationRepository;
import com.hotelJava.accommodation.application.port.DeleteAccommodationUseCase;
import com.hotelJava.accommodation.application.port.SaveAccommodationUseCase;
import com.hotelJava.accommodation.application.port.CreateAccommodationUseCase;
import com.hotelJava.accommodation.application.port.UpdateAccommodationUseCase;
import com.hotelJava.accommodation.domain.Accommodation;
import com.hotelJava.accommodation.dto.CreateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationResponseDto;
import com.hotelJava.accommodation.dto.UpdateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationRequest;
import com.hotelJava.accommodation.dto.CreateAccommodationResponse;
import com.hotelJava.accommodation.dto.UpdateAccommodationRequest;
import com.hotelJava.accommodation.util.AccommodationMapper;
import com.hotelJava.common.error.ErrorCode;
import com.hotelJava.common.error.exception.BadRequestException;
Expand All @@ -23,7 +23,7 @@
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AccommodationService implements SaveAccommodationUseCase, UpdateAccommodationUseCase, DeleteAccommodationUseCase {
public class AccommodationService implements CreateAccommodationUseCase, UpdateAccommodationUseCase, DeleteAccommodationUseCase {

private final AccommodationRepository accommodationRepository;

Expand All @@ -35,16 +35,16 @@ public class AccommodationService implements SaveAccommodationUseCase, UpdateAcc

@Transactional
@Override
public CreateAccommodationResponseDto saveAccommodation(
CreateAccommodationRequestDto createAccommodationRequestDto) {
validateDuplicatedAccommodation(createAccommodationRequestDto);
public CreateAccommodationResponse createAccommodation(
CreateAccommodationRequest createAccommodationRequest) {
validateDuplicatedAccommodation(createAccommodationRequest);

Accommodation accommodation = accommodationMapper.toEntity(createAccommodationRequestDto);
Accommodation accommodation = accommodationMapper.toEntity(createAccommodationRequest);
Picture accommodationPicture =
pictureMapper.toEntity(createAccommodationRequestDto.getPictureDto());
pictureMapper.toEntity(createAccommodationRequest.getPictureDto());

List<Room> rooms =
createAccommodationRequestDto.getCreateRoomRequestDtos().stream()
createAccommodationRequest.getCreateRoomRequests().stream()
.map(
createRoomRequestDto -> {
Room room = roomMapper.toEntity(createRoomRequestDto);
Expand All @@ -59,27 +59,27 @@ public CreateAccommodationResponseDto saveAccommodation(

accommodation.createAccommodation(rooms, accommodationPicture);

return accommodationMapper.toCreateAccommodationResponseDto(
return accommodationMapper.toCreateAccommodationResponse(
accommodationRepository.save(accommodation));
}

@Transactional
@Override
public void updateAccommodation(
Long accommodationId, UpdateAccommodationRequestDto updateAccommodationRequestDto) {
Long accommodationId, UpdateAccommodationRequest updateAccommodationRequest) {

Accommodation accommodation =
accommodationRepository
.findById(accommodationId)
.orElseThrow(() -> new BadRequestException(ErrorCode.ACCOMMODATION_NOT_FOUND));

accommodation.updateAccommodation(
updateAccommodationRequestDto.getName(),
updateAccommodationRequestDto.getType(),
updateAccommodationRequestDto.getPhoneNumber(),
updateAccommodationRequestDto.getAddress(),
pictureMapper.toEntity(updateAccommodationRequestDto.getPictureDto()),
updateAccommodationRequestDto.getDescription());
updateAccommodationRequest.getName(),
updateAccommodationRequest.getType(),
updateAccommodationRequest.getPhoneNumber(),
updateAccommodationRequest.getAddress(),
pictureMapper.toEntity(updateAccommodationRequest.getPictureDto()),
updateAccommodationRequest.getDescription());
}

@Transactional
Expand All @@ -95,8 +95,8 @@ public void deleteAccommodation(Long accommodationId) {
}

private void validateDuplicatedAccommodation(
CreateAccommodationRequestDto createAccommodationRequestDto) {
if (accommodationRepository.existsByName(createAccommodationRequestDto.getName())) {
CreateAccommodationRequest createAccommodationRequest) {
if (accommodationRepository.existsByName(createAccommodationRequest.getName())) {
throw new BadRequestException(ErrorCode.DUPLICATED_NAME_FOUND);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.hotelJava.accommodation.domain.AccommodationType;
import com.hotelJava.picture.dto.PictureDto;
import com.hotelJava.common.embeddable.Address;
import com.hotelJava.room.dto.CreateRoomRequestDto;
import com.hotelJava.room.dto.CreateRoomRequest;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
Expand All @@ -20,7 +20,7 @@
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class CreateAccommodationRequestDto {
public class CreateAccommodationRequest {

@NotBlank(message = "숙소 이름을 입력해주세요.")
@Length(max = 20, message = "숙소 이름은 20자 이내로 입력해주세요.")
Expand All @@ -41,7 +41,7 @@ public class CreateAccommodationRequestDto {

@NotNull(message = "룸 정보가 없습니다.")
@Builder.Default
private List<CreateRoomRequestDto> createRoomRequestDtos = new ArrayList<>();
private List<CreateRoomRequest> createRoomRequests = new ArrayList<>();

private String description;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import com.hotelJava.accommodation.domain.AccommodationType;
import com.hotelJava.picture.dto.PictureDto;
import com.hotelJava.common.embeddable.Address;
import com.hotelJava.room.dto.CreateRoomResponseDto;
import com.hotelJava.room.dto.CreateRoomResponse;

import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand All @@ -17,7 +18,7 @@
@AllArgsConstructor
@Getter
@Setter
public class CreateAccommodationResponseDto {
public class CreateAccommodationResponse {

private Long id;

Expand All @@ -31,7 +32,7 @@ public class CreateAccommodationResponseDto {

private AccommodationType type;

private List<CreateRoomResponseDto> createRoomResponseDtos;
private List<CreateRoomResponse> createRoomResponses;

private PictureDto pictureDto;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
@AllArgsConstructor
@Getter
@Setter
public class FindAccommodationResponseDto {
public class FindAccommodationResponse {

private Long id;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class UpdateAccommodationRequestDto {
public class UpdateAccommodationRequest {

@NotBlank(message = "숙소 이름을 입력해주세요.")
@Length(max = 20, message = "숙소 이름은 20자 이내로 입력해주세요.")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package com.hotelJava.accommodation.util;

import com.hotelJava.accommodation.domain.Accommodation;
import com.hotelJava.accommodation.dto.CreateAccommodationRequestDto;
import com.hotelJava.accommodation.dto.CreateAccommodationResponseDto;
import com.hotelJava.accommodation.dto.FindAccommodationResponseDto;
import com.hotelJava.accommodation.dto.CreateAccommodationRequest;
import com.hotelJava.accommodation.dto.CreateAccommodationResponse;
import com.hotelJava.accommodation.dto.FindAccommodationResponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface AccommodationMapper {

Accommodation toEntity(CreateAccommodationRequestDto createAccommodationRequestDto);
Accommodation toEntity(CreateAccommodationRequest createAccommodationRequest);

@Mapping(source = "accommodation.picture", target = "pictureDto")
@Mapping(source = "accommodation.rooms", target = "createRoomResponseDtos")
CreateAccommodationResponseDto toCreateAccommodationResponseDto(Accommodation accommodation);
@Mapping(source = "accommodation.rooms", target = "createRoomResponses")
CreateAccommodationResponse toCreateAccommodationResponse(Accommodation accommodation);

@Mapping(source = "accommodation.picture", target = "pictureDto")
FindAccommodationResponseDto toFindAccommodationResponseDto(
FindAccommodationResponse toFindAccommodationResponse(
int minimumRoomPrice, Accommodation accommodation);
}
11 changes: 9 additions & 2 deletions app/src/main/java/com/hotelJava/common/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.hotelJava.common.config;

import com.hotelJava.common.util.IdDecodedConverter;
import com.siot.IamportRestClient.IamportClient;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
Expand All @@ -16,6 +19,10 @@ public class WebConfig implements WebMvcConfigurer {
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(idDecodedConverter);
}
}


@Bean
public IamportClient iamportClient(
@Value("${iamport.apiKey}") String apiKey, @Value("${iamport.apiSecret}") String apiSecret) {
return new IamportClient(apiKey, apiSecret);
}
}
Loading

0 comments on commit f4688b9

Please sign in to comment.