ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KB IT’s Your Life 7기] 데이터 베이스 모델링 후기
    카테고리 없음 2026. 6. 23. 07:51

     

    안녕하세요.

     

    오늘은  6월 3주차 기술블로그를 작성하고자 합니다.
    이번주는 데이터베이스 모델링 후기를 작성할 것인데요.

    jsp 와 서블렛 관련 마무리와 스프링 기초 내용으로 작성해보려고 합니다.

     

     

     

     

    1. 프로젝트 환경 설정: IntelliJ & Tomcat 9

     

     

    프로젝트는 Tomcat 9.0.91, Jakarta EE 8, Java 17, Gradle 환경을 기반으로 프로젝트를 구성합니다.

    IntelliJ에서 프로젝트를 생성할 때 SpringLegacy 템플릿을 선택하고,

    서버 설정에서 아티팩트(Artifact) 매핑을 확인하는 과정이 필수입니다.

    특히 '실행/디버그 구성'의 '배포(Deployment)' 탭에서 아티팩트가 정상적으로 추가되어 있는지,

    애플리케이션 컨텍스트 경로가 /로 잘 잡혀 있는지 꼭 확인하셔야 합니다.

     

     


     

    2. 데이터 전송의 기초: HTML5 Form과 GET vs POST

     

    클라이언트의 데이터를 서버로 전달하는 가장 원초적인 방법은 <form> 태그입니다.

    이때 method 속성에 따라 데이터가 전달되는 방식이 완전히 달라지죠.

     

     

    멱등성이란 여러 번 수행해도 결과가 같은 성질을 말합니다.

    쉽게 비유하자면, GET은 식당 메뉴판을 보는 것과 같습니다. 100번을 봐도 메뉴판 내용은 변하지 않죠.

    반면 POST는 음식을 주문하는 것입니다. 두 번 누르면 두 번 결제되고 음식이 두 접시 나오겠죠?

    그래서 데이터의 상태를 바꿀 때는 반드시 POST를 써야 합니다.

     

     


    3. JSP/서블릿의 파라미터 처리 삼총사
    서블릿(Servlet) 환경에서 데이터를 수집할 때 우리는 HttpServletRequest 객체의 세 가지 메서드에 의존합니다.
    • getParameter(name): 단일 값을 가져올 때 씁니다. ID나 PW 처리에 사용되죠.
    • getParameterValues(name): 체크박스처럼 하나의 이름으로 여러 값이 올 때 사용하며, String[] 배열을 반환합니다.
    • getParameterNames(): 전송된 모든 파라미터 이름을 Enumeration 형태로 가져옵니다.
      어떤 데이터가 올지 미리 알 수 없는 동적 폼이나 hidden 필드를 일괄 처리할 때 아주 유용합니다.

     


    4. 스프링 MVC로의 진화: @Controller와 @RequestMapping

     

    이제 스프링의 세계로 넘어와 봅시다. 스프링 MVC의 핵심은 DispatcherServlet입니다. 서블릿 시절에는 우리가 직접 doGet, doPost를 구현했지만, 스프링에서는 이 거대한 '중앙 점원'이 요청을 받아 적절한 컨트롤러에게 배달해 줍니다.

     

    @Controller
    @RequestMapping("/sample")
    @Log4j2
    public class SampleController {
        @RequestMapping("") // URL: /sample
        public void basic() {
            log.info("basic............");
        }
    }
    
    스프링에서 DTO를 파라미터로 선언하면 마법처럼 데이터가 들어오죠? 사실 그 이면에는 스프링의 HandlerAdapter가 있습니다.
    이 녀석이 내부적으로 서블릿의 getParameter()를 호출하고, 자바 리플렉션 기술을 이용해 여러분의 DTO에 값을 채워넣는 것입니다. 즉, 스프링의 자동 수집은 서블릿 메서드들의 고급스러운 포장지인 셈이죠.

     

     


    5. 스프링의 강력한 파라미터 자동 수집 (DTO & List)
    DTO(Data Transfer Object) 자동 주입
    스프링은 파라미터 명과 DTO의 필드 명이 일치하면 값을 자동으로 채워줍니다. 단, 두 가지 철칙을 지켜야 합니다.
    1. 기본 생성자가 반드시 있어야 합니다. (객체를 먼저 만들어야 하니까요!)
    2. Setter(setName 등)가 존재해야 합니다. (만든 객체에 값을 넣어야 하니까요!)
    리스트 및 배열 처리

     

    여러 데이터를 한꺼번에 받을 때 @RequestParam을 사용하면 ArrayList<String> 등으로 즉시 수집이 가능합니다.
    @GetMapping("/ex02List")
    public String ex02List(@RequestParam("ids") ArrayList<String> ids) {
        log.info("ids: " + ids);
        return "ex02List";
    }
    
     
     
    실무 팁 (URL 인코딩): 브라우저에서 list[0].name=aaa와 같은 객체 리스트 형태를 보낼 때, 대괄호([, ]) 문자가 서버에서 에러를 일으킬 수 있습니다. 이럴 때는 %5B( [ ), %5D( ] )로 인코딩하여 전송해야 안전합니다.

    6. 데이터 포맷팅과 응답 처리 (@ResponseBody)
    날짜 변환 (@DateTimeFormat)
    문자열로 들어오는 2024/06/10을 자바의 Date 타입으로 변환하려면 @DateTimeFormat(pattern="yyyy/MM/dd")을 필드에 선언해 주세요. 스프링이 알아서 형변환을 시도합니다.

     

     

    @ResponseBody
    기본적으로 컨트롤러는 리턴 값과 일치하는 JSP 파일을 찾습니다. 하지만 JSON이나 순수 문자열을 직접 브라우저에 쏘고 싶다면 @ResponseBody를 붙이세요. 이는 ViewResolver를 거치지 않고 HTTP Response Body에 데이터를 직접 담아 보냅니다.

     

     


    7. 마무리: 한글 깨짐 방지와 로그 확인

     

    데이터 전송의 복병은 '한글 깨짐' 즉, 모지바케(Mojibake) 현상입니다. POST 방식에서는 반드시 req.setCharacterEncoding("UTF-8") 처리가 필요합니다.
    또한, 내가 만든 컨트롤러가 URL에 잘 매핑되었는지 확인하려면 Log4j2를 활용해 로그를 확인하는 습관을 들여야 합니다. log4j2.xml 파일에 아래 설정을 추가하면 스프링이 어떤 URL을 어떤 메서드에 연결했는지(HandlerMapping) 상세히 보여줍니다.

     

     

     

    <!-- log4j2.xml 내 HandlerMapping 정보 출력 설정 -->
    <Logger name="_org.springframework.web.servlet.HandlerMapping.Mappings" level="DEBUG" additivity="false">
        <AppenderRef ref="console"/>
    </Logger>
    
    이렇게 로그를 통해 DEBUG _org.springframework.web.servlet.HandlerMapping.Mappings - {GET [/sample/ex01]} 같은 메시지를 확인했다면 여러분은 이제 어엿한 스프링 개발자로 한 걸음 더 나아간 것입니다.

     

     

    오늘 준비한 내용은 여기까지입니다! 기본을 알면 스프링은 goat 그 자체 입니다.
    다음 시간에는 이 파라미터들을 가지고 실제 비즈니스 로직을 구현하는 방법을 다뤄보겠습니다.

     

    오늘은 여기까지!

Designed by Tistory.