프로젝트 전체 구조는 아래와 같이
저에게 익숙한 Spring MVC 패턴으로 구성해보았습니다.
MyBatis를 사용했습니다.
원래는 JPARepository를 사용하여 쿼리 질의를 하고 싶었으나 공부할 시간이 부족한 관계로 이전 실습에서 작성한 쿼리들을 바탕으로 그나마 사용경험이 있는 MyBatis로 환경을 구성하였습니다.
MyBatis Mapper XML 파일은 다음과 같이 작성하였습니다.
<ReviewService.java>
public interface ReviewService {
int insertNewReview(int memberIdx, int companyIdx, int roomIdx, int reserveIdx, float rating, String reviewDescription);
int insertReplyToReview(int reviewIdx, String reviewReply);
List<Review> searchReviewList(int companyIdx);
}
<ReviewServiceImpl.java>
@Service
public class ReviewServiceImpl implements ReviewService{
private ReviewMapper reviewMapper;
@Autowired
public ReviewServiceImpl(ReviewMapper reviewMapper) {
this.reviewMapper = reviewMapper;
}
@Override
public int insertNewReview(int memberIdx, int companyIdx, int roomIdx, int reserveIdx, float rating, String reviewDescription) {
return reviewMapper.insertNewReview(memberIdx, companyIdx, roomIdx, reserveIdx, rating, reviewDescription);
}
@Override
public int insertReplyToReview(int reviewIdx, String reviewReply) {
return reviewMapper.insertReplyToReview(reviewIdx, reviewReply);
}
@Override
public List<Review> searchReviewList(int companyIdx) {
return reviewMapper.searchReviewList(companyIdx);
}
}
<ApiController.java>의 /api/review/search에 대한 함수 발췌
@GetMapping("/review/search")
@ApiOperation(value="숙소 리뷰 목록 조회", notes="숙소의 모든 리뷰 목록을 조회한다.")
public ResponseEntity<Map<String, Object>> searchReviewList(@RequestParam int companyIdx) {
Map<String, Object> resultMap = new HashMap<>();
List<Review> reviewList = reviewService.searchReviewList(companyIdx);
resultMap.put("data", reviewList);
return new ResponseEntity<>(resultMap, HttpStatus.OK);
}
후기에 관련된 정보들은 전부 Review 테이블에 모여있습니다. Service와 Controller를 설계할 때 어떤 정보에 관한 서비스 / API 일까? 를 중점으로 생각하며 데이터 격리를 해보려 했습니다.
고쳐야 점은 전부터 @Autowired 어노테이션을 남발했다는 것입니다. 간단한 프로젝트이고, 주어진 시간도 많이 없다보니 이렇게 사용했지만, 실제로 사용할 프로젝트라면 @Autowired가 아닌 생성자를 통해 의존성을 주입받아야 한다고 배웠습니다. 후에 프로젝트를 좀 다듬는 다면 반드시 생성자를 통한 의존성 주입을 먼저 해야겠습니다. Autowired 어노테이션의 단점
com.redjen.yanolja.configuration의 <SpringFoxConfig.java>로 swagger를 설정해주고,
api controller의 각 controller에 @ApiOperation 어노테이션을 추가해주어 간단하게 API 명세서를 작성할 수 있었습니다.
@Configuration
public class SpringFoxConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.ant("/api/**"))
.build();
}
}
설정을 마치고 나서 localhost:8080/swagger-ui.html
로 접속하면 다음 화면이 나옵니다.
local에서 swagger를 통해 다음과 같이 api 테스트도 가능했습니다.
[ 문제 원인 ]
MyBatis XML Configuration 파일들을 찾지 못하여 오류 발생
[ 해결 방안 ]
application.properties에 mybatis.mapper-locations=mapper/**/*.xml
를 추가해 주어 경로 설정해주었음.