Post

이주헌님 포트폴리오 3주차 작업 내용 피드백

메가스터디IT아카데미 SpringBoot 백엔드 개발자 과정 주말반 (25.02.22 ~ 25.09.13). 이주헌님의 포트폴리오 3주차 작업 내용에 대한 피드백

이주헌님 포트폴리오 3주차 작업 내용 피드백

이주헌님 포트폴리오 3주차 작업 내용 피드백

작성일: 2025-09-06
github에 push된 코드를 바탕으로 장점, 단점, 그리고 개선사항을 정리했습니다.
HTML,CSS는 최종적으로 화면에 보이는 결과가 가장 우선됩니다. 아래 사항은 참고만 하시고 적용 여부는 본인이 직접 판단하시면 됩니다.

📌 개요

이번 주에는 Facility 관련 Model, Mapper, Service를 새로 구현하고, 이를 통해 어트랙션 목록 조회, 상세 조회, 운휴 정보 조회 기능을 개발하셨네요. 전반적으로 SpringBoot의 계층형 구조에 맞춰 기능들을 체계적으로 구현하려는 노력이 돋보입니다.


👍 잘된 점

1. MyBatis 동적 SQL을 활용한 검색 기능 구현

FacilityMapper.java 파일에서 어트랙션 목록을 조회할 때, zonekeyword 파라미터 값의 존재 여부에 따라 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. controllercontrollers 폴더 중복 (수정 필요)

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)을 완성하는 것에 집중하시면 좋겠습니다. 이 과정을 통해 전체적인 구조에 대한 이해가 더욱 깊어질 것입니다.

다음 주 작업도 응원하겠습니다!

This post is licensed under CC BY 4.0 by the author.