GDJ 24/05/28 (JSTL을 사용하여 데이터 가져오기)

kimuki·2024년 5월 28일
클라이언트 > 컨트롤러 > 서비스 > 매퍼 > 서비스 > 컨트롤러 > 뷰 > 클라이언트

Spring MVC
Mybatis
EL / JSTL
DI + AOP(관점지향)


데이터 insert 과정
클라이언트 웹 브라우저에서 데이터 입력 받음 (form, input 태그)
> 입력된 데이터 Controller로 전송 > Controller가 받은 데이터 Service로 넘기기
> Service에서 mapper로 넘겨서 Query 진행 > Query 결과 Service로 반환
> 반환된 결과 Controller로 반환 > 클라이언트 View로 결과 출력

sts 4.22.1 ver download
spring 3.2.6 (mybatis framework 사용하기 위함)


STS dependency 설정 후 LPS 에러 발생
에러명 : failed to fetch generation from spring io port out of range-1
>>
stackoverflow에 의하면 application.properties에서
port 번호를 할당하지 않았기 때문에 발생한 에러라고 함

# 커넥션 풀
톰캣이 부팅됨과 동시에 커넥션을 만들어 List에 저장한 후
application.attribute에 저장
application.attribute에 저장하는 이유 > 톰캣 유지시간 동안 사용하기 위함

커넥션풀을 사용하면 이점이 있지만 톰캣 부팅속도가 증가한다
>> 개발자 입장에서의 단점일 뿐임

Spring MVC model 구현
feat. Spring boot, lombok, Mybatis, JSTL, MariaDB, JSP(View)

Controller, VO, Mapper를 이용한 Spring MVC 구조 구현

application.properties

# 서버설정
spring.application.name=mvc
server.servlet.context-path=/
server.port=80

# 뷰 설정
# /WEB-INF/view/~~~.jsp
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

# 커넥션 풀
# datasource : 커넥션 풀을 구현하기 위한 데이터타입
# datasource는 Connection의 배열로 구성됨
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/mvc
spring.datasource.username=root
spring.datasource.password=java1234

MemberVO.java (VO)

package com.example.mvc.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data					// lombok annotation, getter, setter 자동생성 등
@AllArgsConstructor		// 모든 변수를 인자로 받는 생성자 생성
@NoArgsConstructor		// 인자 없는 기본 생성자 생성
public class MemberVO {
	private int memberNo;
	private String memberName;
	private int memberAge;
	private String createDate;
}

MemberMapper.java (Mapper)

package com.example.mvc.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.mvc.vo.MemberVO;

@Mapper	// DAO 자동생성, 다형성에 따라 MemberMapper로 selectMemberList() 호출 가능
public interface MemberMapper {
	
	public List<MemberVO> selectMemberList();
	// mapper.xml 파일의 쿼리와 합쳐져
	// JDBC 코드가 구현된 클래스를 만든다
}

MemberMapper.xml (Mapper / MyBatis)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace의 값은 mapper interface 이름 -->
<mapper namespace="com.example.mvc.mapper.MemberMapper">
	<select id="selectMemberList" resultType="com.example.mvc.vo.MemberVO">
		SELECT
			member_no memberNo,		<!-- setMemberNo() -->
			member_name memberName,
			member_age memberAge,
			create_date createDate
		FROM
			member
	</select>
</mapper>

MemberContoller.java (Controller)

package com.example.mvc.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.example.mvc.mapper.MemberMapper;
import com.example.mvc.vo.MemberVO;


@Controller
public class MemberController {
	@Autowired	// 의존관계주입(DI)
	private MemberMapper memberMapper;	// class x implements MemberMapper
	
	@GetMapping("/memberList")
	public String memberList(Model model) {	// WebServlet("") 역할
		
		List<MemberVO> list = memberMapper.selectMemberList();
		model.addAttribute("list", list);
		// request.setAttribute("list", list);
		
		return "memberList";		// request.getRequestDispatcher("memberList").forward(request, response) 역할
	}
}

memberList.jsp (View) - JSTL 사용

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>멤버 목록</title>
</head>
<body>
	<h1>Member List</h1>
	<c:forEach var="m" items="${list}">
		<div>번호 : ${m.memberNo}</div>
		<div>이름 : ${m.memberName}</div>
		<div>나이 : ${m.memberAge}</div>
		<div>생성날짜 : ${m.createDate}</div>
	</c:forEach>
</body>
</html>

memberList.jsp 출력결과

profile
Road OF Developer

0개의 댓글