이주헌님 포트폴리오 3주차 작업 내용 피드백
메가스터디IT아카데미 SpringBoot 백엔드 개발자 과정 주말반 (25.02.22 ~ 25.09.13). 이주헌님의 포트폴리오 3주차 작업 내용에 대한 피드백
이주헌님 포트폴리오 3주차 작업 내용 피드백
작성일: 2025-09-06
github에 push된 코드를 바탕으로 장점, 단점, 그리고 개선사항을 정리했습니다.
HTML,CSS는 최종적으로 화면에 보이는 결과가 가장 우선됩니다. 아래 사항은 참고만 하시고 적용 여부는 본인이 직접 판단하시면 됩니다.
📌 개요
이번 주에는 Facility
관련 Model
, Mapper
, Service
를 새로 구현하고, 이를 통해 어트랙션 목록 조회, 상세 조회, 운휴 정보 조회 기능을 개발하셨네요. 전반적으로 SpringBoot의 계층형 구조에 맞춰 기능들을 체계적으로 구현하려는 노력이 돋보입니다.
👍 잘된 점
1. MyBatis 동적 SQL을 활용한 검색 기능 구현
FacilityMapper.java
파일에서 어트랙션 목록을 조회할 때, zone
과 keyword
파라미터 값의 존재 여부에 따라 SQL 조건절을 동적으로 생성하도록 구현하셨습니다. MyBatis의 <script>
, <where>
, <if>
태그를 적절하게 사용하여 다양한 검색 시나리오에 대응할 수 있는 유연한 코드를 작성한 점이 좋습니다.
- 소스 파일:
src/main/java/com/example/adv/mappers/FacilityMapper.java
- 라인: 13-23
- 인용 코드:
1 2 3 4 5 6 7 8 9 10 11 12 13
@Select("<script>" + "SELECT id, type, name, summary, description, zone, " + " thumb_path, image_path, min_height, reg_date, edit_date " + "FROM facilities " + "<where>" + " type = 'ATTRACTION' " + " <if test='zone != null and zone != ""'>AND zone = #{zone}</if>" + " <if test='keyword != null and keyword != ""'>" + " AND (name LIKE CONCAT('%',#{keyword},'%') OR summary LIKE CONCAT('%',#{keyword},'%'))" + " </if>" + "</where>" + "ORDER BY name ASC" + "</script>")
2. 새로운 서비스 계층의 체계적인 추가
FacilityService
인터페이스와 그 구현체인 FacilityServiceImpl
을 새로 추가하여 데이터베이스 로직(Mapper)과 비즈니스 로직을 분리한 점이 훌륭합니다. 이는 코드의 유지보수성과 재사용성을 높이는 좋은 설계 방식입니다.
- 소스 파일:
src/main/java/com/example/adv/services/impl/FacilityServiceImpl.java
- 라인: 13-18
- 인용 코드:
1 2 3 4 5 6 7 8 9 10
@Service public class FacilityServiceImpl implements FacilityService { private final FacilityMapper facilityMapper; private final FacilityClosureMapper closureMapper; public FacilityServiceImpl(FacilityMapper f, FacilityClosureMapper c){ this.facilityMapper = f; this.closureMapper = c; } // ... 이하 메서드 구현 }
🙋 개선점
1. Mapper 인터페이스에 @Mapper
어노테이션 누락 (수정 필요)
FacilityClosureMapper
인터페이스에 @Mapper
어노테이션이 빠져있습니다. SpringBoot가 MyBatis Mapper 인터페이스를 스캔하고 구현체를 자동으로 생성하려면 이 어노테이션이 반드시 필요합니다. 현재는 FacilityMapper
에만 적용되어 있어 FacilityClosureMapper
는 Bean으로 등록되지 않았을 가능성이 높습니다.
- 개선 제안:
FacilityClosureMapper
인터페이스 선언부 위에@Mapper
어노테이션을 추가해야 합니다. - 소스 파일:
src/main/java/com/example/adv/mappers/FacilityClosureMapper.java
- 라인: 7
- 현재 코드:
1 2 3
public interface FacilityClosureMapper { // ... }
- 개선 예시:
1 2 3 4
@Mapper // <--- 이 부분 추가 public interface FacilityClosureMapper { // ... }
2. controller
와 controllers
폴더 중복 (수정 필요)
src/main/java/com/example/adv/controllers
폴더와 src/main/java/com/example/adv/controller
폴더가 모두 존재합니다. 패키지에 포함되어 있는 클래스도 서로 중복되는 것 같습니다. 이는 프로젝트 구조를 혼란스럽게 만들 수 있으므로, 하나의 폴더로 통일하는 것이 좋습니다.
✨ 총평
새로운 기능들을 SpringBoot의 구조에 맞게 잘 추가하고 계십니다. 특히 MyBatis를 활용한 동적 쿼리 구현은 매우 훌륭합니다.
전반적으로 수업 내용을 잘 이해하고 있는 것 같습니다. 다만, @Mapper
어노테이션 누락과 같은 작은 실수가 발생할 수 있으니, 앞으로는 새로운 Mapper 인터페이스를 추가할 때마다 어노테이션이 제대로 적용되었는지 꼭 확인하시기 바랍니다.
지금 단계에서는 Service와 Controller를 연동하고, 완전한 데이터 흐름(Request → Controller → Service → Mapper → DB → View)을 완성하는 것에 집중하시면 좋겠습니다. 이 과정을 통해 전체적인 구조에 대한 이해가 더욱 깊어질 것입니다.
다음 주 작업도 응원하겠습니다!