목차

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

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

      ⏳ Time Log/TIL · 하루

      Day 31 (12/1) - Spring Boot 전환 및 React Router 동적 라우팅 실습

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

      1. Spring Boot 프로젝트 환경 설정 (오전)

      Lombok 설치 및 STS 연동

      • 설치 경로: D:\Dev\lib 등의 경로에 lombok.jar 배치
      • 설정 방법: CMD에서 java -jar lombok.jar 실행 후 STS4 설치 경로 선택하여 설치
      • 목적: @Getter, @Setter, @ToString 등을 통해 반복적인 자바 코드(Boilerplate) 제거

      Spring Starter Project 생성 (Ver 3.5.8)

      • Java Version: 21
      • 주요 의존성(Dependencies):
        • Spring Web: 웹 개발을 위한 기본 라이브러리 (내장 톰캣 포함)
        • Spring Boot DevTools: 코드 수정 시 자동 리로딩 지원
        • Lombok: 어노테이션 기반 코드 자동 생성
        • MySQL Driver: DB 연동을 위한 드라이버

      JSP View Resolver 및 DB 설정 (application.properties)

      # MySQL 연결 설정
      spring.datasource.url=jdbc:mysql://localhost:3306/edudb?serverTimezone=Asia/Seoul
      spring.datasource.username=jdbctest
      spring.datasource.password=1234
      
      # JSP 뷰 경로 설정
      spring.mvc.view.prefix=/WEB-INF/views/
      spring.mvc.view.suffix=.jsp

      2. Spring MVC 핵심 개념 및 흐름

      • DispatcherServlet: 모든 요청을 중앙에서 관리하는 프론트 컨트롤러 (배달 앱의 서버 역할)
      • IoC (제어의 역전): 객체 생성 및 관리 권한을 개발자가 아닌 스프링 컨테이너가 가짐
      • DI (의존성 주입): @Autowired를 통해 필요한 객체를 외부에서 주입받는 방식
      • Bean: 스프링 컨테이너가 관리하는 자바 객체

      3. Servlet → Spring MVC 마이그레이션 실무

      주요 변경 사항

      구분 기존 Servlet 방식 Spring MVC 방식
      매핑 ActionFactory + command 파라미터 @GetMapping, @PostMapping 어노테이션
      데이터 바인딩 request.getParameter() 일일이 수행 메서드 파라미터에 VO 선언 시 자동 매핑
      화면 이동 RequestDispatcher.forward() 문자열(뷰 이름) 반환 또는 redirect: 사용

      게시글 등록 예시 (Refactoring)

      @PostMapping("/board_write")
      public String boardWrite(BoardVO vo) {
          // 1. VO 객체로 데이터 자동 바인딩 (name 속성값 일치 필수)
          boardService.insertBoard(vo); 
          // 2. 등록 후 목록으로 이동 (새로운 GET 요청 유도)
          return "redirect:board_list"; 
      }

      4. React Router 동적 라우팅 (오후)

      기본 설정

      • 설치: npm i react-router-dom
      • 적용: App.jsx를 BrowserRouter로 감싸서 SPA 환경 구축

      동적 경로 처리 방식 비교

      1. URL Parameter (Path Variable)
        • 형태: /diary/:id
        • 용도: 특정 데이터 조회 (상세 페이지 등)
        • 가져오기: useParams() 훅 사용
      2. Query String
        • 형태: /search?q=keyword&sort=latest
        • 용도: 검색 필터링, 정렬 옵션 전달
        • 가져오기: useSearchParams() 훅 사용

      ❓ 질문 & 추가 조사 내용 (Q&A)

      Q1. redirect: vs '뷰 이름 리턴'의 차이

      • 뷰 이름 리턴 ("board_list"):
        • DispatcherServlet이 해당 JSP를 찾아 화면을 그림 (Forward 방식)
        • 브라우저의 URL 주소는 변하지 않음
      • redirect:board_list:
        • 브라우저에게 해당 주소로 다시 요청하라는 응답을 보냄 (302 Redirect)
        • URL 주소가 변경됨. 게시글 등록 후 새로고침 시 중복 등록을 방지하기 위해 필수 사용

      Q2. @RequestParam vs VO(Command Object)

      • @RequestParam: 단일 파라미터(id, page 등)를 받을 때 유용하며, 필수 여부나 기본값 설정 가능
      • VO 바인딩: 회원가입, 게시글 작성 등 전송되는 필드가 많을 때 객체로 한 번에 담아 가독성 향상

      Q3. React에서 파라미터 추출 실전 코드

      import { useParams, useSearchParams } from 'react-router-dom';
      
      const Diary = () => {
          // 1. URL 파라미터 가져오기 (/diary/1)
          const { id } = useParams();
      
          // 2. 쿼리 스트링 가져오기 (/diary?sort=latest)
          const [searchParams, setSearchParams] = useSearchParams();
          const sort = searchParams.get("sort");
      
          return <div>일기 번호: {id}, 정렬: {sort}</div>;
      }