목차

    ⏳ Time Log/1. One Day (Daily · TIL)

    Day 35 (12/5) – Apache Maven 표준 디렉터리 구조

    this.Serena 2026. 2. 20. 12:17

    🏗️ Apache Maven 표준 디렉터리 구조

    Maven은 프로젝트의 일관성을 위해 정해진 폴더 구조를 따름

    디렉터리 이름 용도 및 목적
    프로젝트 홈 pom.xml 파일 및 모든 하위 디렉터리 포함
    src/main/java 프로젝트의 실제 자바 소스 코드 (.java)
    src/main/resources 설정 파일, 프로퍼티 파일 등 실행 시 필요한 리소스
    src/test/java JUnit, TestNG 등 단위 테스트를 위한 자바 소스 코드
    src/test/resources 테스트 실행 시에만 필요한 리소스 파일

    🎨 Front-end: Bootstrap & JSP 연동

    1. Bootstrap 및 레이아웃 설정

    • CDN 도입: 별도 설치 없이 <link> 태그로 Bootstrap 5.3 활용
    • 레이아웃 분리: header.jsp, footer.jsp를 분리하여 <%@ include %> 방식으로 공통 관리

    2. JSTL 날짜 포맷팅 및 출력

    • LocalDateTime 대응: Java 8 이후의 LocalDateTime 형식을 JSP에서 출력할 때 T 문자를 제거하거나 포맷 변경 필요
    • 방법: DTO에 getCreatedDate() 같은 포맷팅 메서드를 추가하거나 JSTL <c:out> 내에서 replace 함수 활용
    <td><c:out value="${member.regDate.toString().replace('T', ' ')}" /></td>

    🖱️ JavaScript: 다중 액션 핸들링 (ActionForm)

    수정, 삭제, 목록 이동을 하나의 폼(actionForm)에서 처리하기 위해 버튼별로 이벤트 리스너를 설정함

    const formObj = document.querySelector("#actionForm")
    
    // 수정 버튼 클릭 시
    document.querySelector(".btnModify").addEventListener("click", () => {
        formObj.action = '/board/modify'
        formObj.method = 'post'
        formObj.submit()
    })
    
    // 목록 버튼 클릭 시 (GET 방식)
    document.querySelector(".btnList").addEventListener("click", () => {
        formObj.action = '/board/list'
        formObj.method = 'get'
        formObj.submit()
    })
    
    // 삭제 버튼 클릭 시
    document.querySelector(".btnRemove").addEventListener("click", () => {
        formObj.action = '/board/remove'
        formObj.method = 'post'
        formObj.submit()
    })

    🧪 MyBatis & JUnit 테스트 고도화

    1. MyBatis 자동 생성 키 (useGeneratedKeys)

    데이터 삽입(Insert) 후 DB에서 생성된 자동 증가값(Auto Increment)을 바로 확인해야 할 때 사용함

    <insert id="insert" useGeneratedKeys="true" keyProperty="mno">
        INSERT INTO tbl_member (name, email) VALUES (#{name}, #{email})
    </insert>
    

    2. JUnit 단위 테스트

    로직이 성공적으로 수행되었는지 검증하기 위해 assertNotNull 등을 활용

    • 검증: assertNotNull(dto.getMno()) - 데이터가 정상적으로 저장되어 PK값이 생성되었는지 확인
    • 절차: 매퍼 작성 → 단위 테스트(DB 연동 확인) → 서비스 구현 → 컨트롤러 연결 순으로 진행

    ✏️ 메모 및 향후 일정

    • 진행 범위: 스프링6 레거시 PDF p.207 ~ (Part 2 게시판 기능 구현 중)
    • 특이사항: Bootstrap Modal을 활용한 처리 결과(등록/수정 성공) 알림 기능 추가 예정
    • 실습 과제: 제공받은 테이블 명세서를 기반으로 직접 CRUD 전 과정을 구현하는 sp3 프로젝트 실습 대기