[필수용어 실무 3편] JSP & MVC 패턴 실무 흐름 완전정복 25선

들어가며

개발자가 되기 위해 프로그래밍 언어를 배우고 나서 이제 조금 더 전문적인 웹개발을 배우려고 하다 보면 누구나 한 번쯤 듣는 말이 있습니다.

“이 프로젝트는 MVC 패턴으로 되어 있어요.”
JSP에서 Controller를 타고 DAO까지 내려갑니다.”

하지만 막상 실무에 들어가면 Controller, Service, DAO, JSP 같은 용어들이 너무 많고, “도대체 데이터가 어디서 와서 어디로 가는 건지” 헷갈리기 쉽습니다.

이 글에서는 JSP와 MVC 패턴흐름을 단계별로 설명하고, 비전공자도 “아, 이렇게 연결되는 거구나!” 하고 이해할 수 있도록 실제 예시와 실무에서의 활용을 중심으로 정리했습니다.

필수용어 실무편 JSP와 MVC패턴 등의 실무 개발용어

MVC 패턴이란?

MVC프로그램을 세 부분으로 나누어 개발하는 구조입니다.
이 방식은 유지보수성과 확장성이 뛰어나 실무에서 표준으로 사용됩니다.

구분역할실제 예시
Model데이터 처리 (DB 접근, 비즈니스 로직)Service, DAO
View사용자 화면 (UI 표현)JSP, HTML
Controller요청을 받아 처리 흐름 제어Controller.java

쉽게 말하면 Controller 와 Model, View는 다음과 같은 역할을 한다고 이해하시면 됩니다.

  • Controller“누가, 무엇을 요청했는가”를 받아서
  • Model(Service/DAO)“그걸 어떻게 처리할까”를 계산하고
  • View(JSP)“그 결과를 어떻게 보여줄까”를 담당합니다.

JSP란?

JSP (Java Server Page)HTML 코드 안에 Java 코드를 함께 사용할 수 있는 서버 측 기술입니다.
즉, 사용자가 어떤 페이지를 요청하면 서버가 JSP를 실행해 HTML 결과를 만들어서 브라우저로 보내는 구조입니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
  <h2>안녕하세요, JSP입니다!</h2>
</body>
</html>

위의 예문 코드를 함께 보았습니다만. 이렇게만 보면 잘 이해가 안되실 겁니다. 위 코드를 해석해보면 다음과 같습니다.

<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>

이렇게 작성된 부분이 JSP의 기본이라고 생각하시면 됩니다. HTML 코드 안에서 Java 코드를 사용하기 위해서는 위와 같이 <%@ %> 를 사용하여 나타낼 수 있습니다.

<html>
<body>
<h2>안녕하세요, JSP 입니다! </h2>
</body>
</html>

이 부분이 우리가 이미 알고 있는 HTML 구조입니다. 이제 조금 이해가 잘 되실 거라 생각됩니다.

이렇게 작성된 JSP는 서버에서 실행된 뒤, 브라우저에는 HTML만 전달됩니다.

JSP는 이렇게 Java코드를 HTML 안에서 사용할 수 있게 해주는 부분을 뜻합니다. 또한 이렇게 쓰이는 HTML구조와 CSS의 문법은 JSP 실무에서 굉장히 다양하며 많이 쓰이고 있습니다. 버튼을 만들고 해당 버튼에 대한 꾸밈요소나 버튼을 클릭했을 때 동작해야 할 링크페이지, 팝업페이지 등 매우 유용하고 많은 프론트 요소를 갖고 있기에 HTML과 CSS에 대해 기본적으로 이해하고 있으시면 실무에서 많은 도움을 받을 수 있습니다.

아직 HTML에 대해 이해가 잘 되지 않거나 사전 지식이 없으시다면 다음 글을 참고해주세요.
👉 [입문] HTML/CSS란? (프론트엔드 1편) – AI 시대, 기본을 아는 사람의 경쟁력
👉 [입문] HTML/CSS 사용 (프론트엔드 2편) – 첫 웹페이지 만들기


MVC 구조의 실제 흐름

요청에서 화면까지의 전체 흐름

1️⃣ 사용자가 /userList.do 페이지를 요청
2️⃣ Controller가 요청을 받음 (@RequestMapping)
3️⃣ Service를 통해 로직 처리
4️⃣ DAO가 DB를 조회
5️⃣ 결과 데이터를 model 객체에 담음
6️⃣ Controller가 return "user/userList"; 반환
7️⃣ ViewResolver가 JSP 경로(/WEB-INF/views/user/userList.jsp)를 찾음
8️⃣ JSP가 화면에 데이터를 출력


실제 코드 예시

// UserController.java
@RequestMapping("/userList.do")
public String userList(Model model) {
    List&lt;UserVO> list = userService.selectUserList();
    model.addAttribute("userList", list);
    return "user/userList"; // JSP 파일 이름
}
&lt;!-- userList.jsp -->
&lt;table border="1">
  &lt;tr>&lt;th>이름&lt;/th>&lt;th>이메일&lt;/th>&lt;/tr>
  &lt;c:forEach var="user" items="${userList}">
    &lt;tr>
      &lt;td>${user.name}&lt;/td>
      &lt;td>${user.email}&lt;/td>
    &lt;/tr>
  &lt;/c:forEach>
&lt;/table>

Controller → model.addAttribute() 로 데이터 전달
JSP → ${}(EL표현식)으로 값 출력


전자정부프레임워크 기준 폴더 구조

src/
 ├─ main/
 │   ├─ java/
 │   │   ├─ com.example.controller/
 │   │   ├─ com.example.service/
 │   │   ├─ com.example.dao/
 │   ├─ resources/
 │   │   ├─ mapper/
 │   ├─ webapp/
 │   │   ├─ WEB-INF/
 │   │   │   ├─ views/
 │   │   │   │   └─ userList.jsp

이 구조는 대부분의 공공기관, 기업 프로젝트에서도 동일하게 유지됩니다.

Tip) JSP 파일은 보안상 WEB-INF 폴더 안에 넣는 것이 원칙입니다. (사용자가 URL로 직접 접근할 수 없도록 하기 위함)


실무 흐름 핵심 25선

위 JSP와 MVC 패턴에 대해 알았으니 이제 본격적으로 실무에서 사용되는 흐름에 대해 정리해 보겠습니다. 처음 입문하시는 분들이나 웹개발의 기초를 쌓아야 하는 주니어 및 초급 개발자라면 이 부분을 잘 보시고 흐름을 이해하시면 될 것 같습니다.

1. 사용자 요청

사용자가 주소창에 입력하거나 버튼 클릭으로 요청을 보냄 (예: http://localhost:8080/myapp/member/list.do)

&lt;form action="/member/list.do" method="get">
  &lt;button>회원 목록 보기&lt;/button>
&lt;/form>

2. DispatcherServlet 실행

Spring MVC의 핵심.(전자정부프레임워크도 마찬가지)
모든 요청을 공통 진입점(Front Controller) 에서 받습니다.

3. HandlerMapping에서 Controller 연결

요청 URL(/member/list.do)과 실행할 Controller를 매핑합니다.
매핑 정보는 servlet-context.xml 또는 어노테이션(@Controller, @RequestMapping)으로 설정됩니다.

4. Controller가 호출됨

Controller가 사용자의 요청을 받아 로직을 처리할 준비를 합니다.

@Controller
@RequestMapping("/member")
public class MemberController {
    @Autowired
    private MemberService memberService;

    @RequestMapping("/list.do")
    public String list(Model model) {
        model.addAttribute("members", memberService.getMemberList());
        return "member/memberList";
    }
}

5. Service 호출

비즈니스 로직 담당. 여러 DAO를 묶거나 트랜잭션을 처리합니다.

@Service
public class MemberService {
    @Autowired
    private MemberDao memberDao;

    public List&lt;MemberDTO> getMemberList() {
        return memberDao.selectAll();
    }
}

6. DAO 호출

DB에 직접 접근하는 계층.

@Repository
public class MemberDao {
    @Autowired
    private SqlSessionTemplate sqlSession;

    public List&lt;MemberDTO> selectAll() {
        return sqlSession.selectList("member.selectAll");
    }
}

7. MyBatis / JDBC로 DB 접근

SQL Mapper(MyBatis)가 SQL문을 실행합니다. (예: member-mapper.xml)

&lt;select id="selectAll" resultType="MemberDTO">
    SELECT id, name, email FROM MEMBER
&lt;/select>

8. 데이터 조회

DB 결과를 Java 객체(List<MemberDTO>)로 반환받음.

9. 결과 반환

Service → Controller로 결과를 전달합니다.

10. Model에 데이터 담기

Controller에서 JSP로 넘길 데이터를 담습니다.

model.addAttribute("members", members);

11. View 이름 반환

Controller는 “어떤 JSP를 보여줄지” 반환합니다.

return "member/memberList";

12. ViewResolver로 JSP 경로 찾기

ViewResolver가 WEB-INF/views/member/memberList.jsp로 실제 파일 경로를 조합합니다.

13. JSP 실행

이제 JSP가 실행되며, Model에 담긴 데이터가 JSP로 전달됩니다.

14. EL/JSTL로 데이터 출력

EL(Expression Language)과 JSTL로 데이터를 화면에 표시합니다.

&lt;c:forEach var="m" items="${members}">
  &lt;p>${m.name} (${m.email})&lt;/p>
&lt;/c:forEach>

15. HTML 결과 생성

JSP가 최종 HTML로 변환되어 브라우저로 전송됩니다.

16. 응답 전송

서버에서 사용자 브라우저로 HTML 응답을 보냅니다.

17. 사용자 브라우저에서 렌더링

사용자 화면에 웹페이지가 실제로 보이게 됩니다.

18. 오류 발생 시 예외 페이지 이동

Controller나 JSP에서 오류가 발생하면 error.jsp 또는 ExceptionHandler로 이동합니다.

19. 로그 출력

log.info(), System.out.println()으로 흐름을 기록.
문제 발생 시 디버깅에 필수입니다.

20. 세션 유지

로그인 정보, 사용자 상태를 HttpSession으로 관리합니다.

21. 공통 인터셉터 적용

요청 전후에 공통 기능(로그인 체크, 로그 기록 등)을 수행합니다.

22. AOP 트랜잭션 처리

Service 계층의 DB작업에 대해 커밋/롤백을 제어합니다.

23. 공통 유틸 클래스 동작

날짜 포맷, 암호화 등 자주 쓰는 기능을 별도 유틸로 분리해 재사용합니다.

24. 메시지 프로퍼티 로드

다국어 메시지, 경고 문구 등을 message.properties에서 불러옵니다.

25. JSP 최종 렌더링

최종적으로 완성된 화면이 사용자에게 표시됩니다.


실무 포인트 요약

구분핵심 개념비고
Controller요청/응답 제어 중심@Controller
Service비즈니스 로직, 트랜잭션@Service
DAODB 접근 (MyBatis, JDBC)@Repository
JSP출력 전용EL, JSTL 사용
Model데이터 전달addAttribute()

정보처리기사 실기와의 연관성

정보처리기사 실기에서는 “Model1 vs Model2 구조 차이” 문제가 자주 출제됩니다.

  • Model1: JSP에서 직접 DB에 접근하는 옛 방식
  • Model2 (MVC): JSP는 화면 표현만 담당하고 Controller/Service가 로직을 수행

Tip) 실무에서는 거의 모두 Model2 구조를 사용합니다.


참고자료


마무리

이제 JSP와 MVC 패턴의 전체 흐름이 눈에 보이기 시작할 겁니다.
Controller → Service → DAO → JSP 로 이어지는 데이터의 흐름을 이해하면, 실무 프로젝트 구조도 한결 명확하게 보이게 됩니다.

다음 편 예고

다음 편에서는 JSP 데이터 처리 & 화면 출력 로직에서 실제 화면단에서 데이터를 출력하고, JSTL을 활용하는 방법을 구체적으로 다룹니다. JSTL은 공공기관 실무에서 굉장히 많이 다루기 때문에 다음편도 기대해주세요!

지난 편을 못보셨다면?
[필수용어 실무 1편] 비전공자가 실무에서 바로 활용 가능한 데이터 연동 & 서버 흐름 25선
[필수용어 실무 2편] 실무에서 마주치는 예외 처리 & 트러블슈팅 핵심 25선

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤