목차

    불편함을 코드로 지웁니다.

    개발 공부 노트, 개발 도구와 문제를 해결한 과정, AI 프롬프트와 Obsidian 활용법을 정리합니다.

      ⏳ Time Log/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 프로젝트 실습 대기