-
[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의 필드 명이 일치하면 값을 자동으로 채워줍니다. 단, 두 가지 철칙을 지켜야 합니다.- 기본 생성자가 반드시 있어야 합니다. (객체를 먼저 만들어야 하니까요!)
- 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 그 자체 입니다.다음 시간에는 이 파라미터들을 가지고 실제 비즈니스 로직을 구현하는 방법을 다뤄보겠습니다.오늘은 여기까지!