Controller

package kr.or.ddit.controller.member;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IMemberService;
import kr.or.ddit.vo.MemberVO;
import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/crud/member")
@Slf4j
public class CrudMemberController {

	@Inject
	private IMemberService service;
	
	@GetMapping(value="/register")
	public String crudMemberRegisterForm() {
		log.info("crudMemberRegisterForm() 실행..!");
		return "crud/member/register";
	}
	
	@RequestMapping(value="/register", method = RequestMethod.POST)
	public String crudMemberRegister(MemberVO member, Model model) {
		log.info("crudMemberRegister() 실행...!");
		service.register(member);
		model.addAttribute("msg", "등록이 완료되었습니다.");
		return "crud/member/success";
	}
	
	@GetMapping(value="/list")
	public String list(Model model) {
		List<MemberVO> memberList = service.list();
		model.addAttribute("memberList", memberList);
		return "crud/member/list";
	}
	
**// 회원 상세보기 (MemberVO에 member_auth테이블 조인한 결과 까지 다 들어옴
// MemberVO 멤버 변수중 List<MemberAuth>가 있음**
	@GetMapping(value="/read")
	public String read(int userNo, Model model) {
		MemberVO member = service.read(userNo);
		model.addAttribute("member", member);
		return "crud/member/read";
	}
}

Service

interface로 먼저 IBoardSerivce를 생성하고 한다.

package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.MemberMapper;
import kr.or.ddit.service.IMemberService;
import kr.or.ddit.vo.MemberAuth;
import kr.or.ddit.vo.MemberVO;

@Service
public class MemberServiceImpl implements IMemberService {

	@Inject
	private MemberMapper mapper;
	
	@Override
	public void register(MemberVO member) {
		mapper.create(member);
		
		MemberAuth memberAuth = new MemberAuth();
		memberAuth.setUserNo(member.getUserNo());
		memberAuth.setAuth("ROLE_USER");
		
		mapper.createAuth(memberAuth);
	}
	@Override
	public List<MemberVO> list() {
		return mapper.list();
	}

**// 회원 상세보기 서비스**
	@Override
	public MemberVO read(int userNo) {
		return mapper.read(userNo);
	}

}

MemberMapper

package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.MemberAuth;
import kr.or.ddit.vo.MemberVO;

public interface MemberMapper {

	public void create(MemberVO member);

	public void createAuth(MemberAuth memberAuth);

	public List<MemberVO> list();

	public MemberVO read(int userNo);

}

Mapper

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
 <mapper namespace="kr.or.ddit.mapper.MemberMapper">
 
**<!-- resultMap="resultMap" 이라고 쓴곳을 지목하여 resultMap을 이용해 값 설정해줌-->**
 	<resultMap type="memberVO" id="memberMap">
 		<id property="userNo" column="user_no"/>
 		<result property="userNo" column="user_no"/>
 		<result property="userId" column="user_id"/>
 		<result property="userPw" column="user_pw"/>
 		<result property="userName" column="user_Name"/>
 		<result property="regDate" column="reg_date"/>
 		<result property="updDate" column="upd_date"/>
**<!-- 이부분은 또다른 resultMap을 선언하여 member_auth에 대한 결과 담음-->**
 		<collection property="authList" resultMap="authMap"/>
 	</resultMap>
 	
**<!-- MemberVO에 auth에 관한 List를 위해 해당 resultMap 을 또 만들어 줌-->**
 	<resultMap type="memberAuth" id="authMap">
 		<result property="userNo" column="user_no"/>
 		<result property="auth" column="auth"/>
 	</resultMap>
 	
 	<insert id="create" parameterType="memberVO" useGeneratedKeys="true">
 		<selectKey keyProperty="userNo" resultType="int" order="BEFORE">
 			select seq_member.nextval from dual
  		</selectKey>
		insert into member(
			user_no, user_id, user_pw, user_name, reg_date, upd_date
		)  values (
			#{userNo}, #{userId}, #{userPw}, #{userName}, sysdate, sysdate
		)
 	</insert>
 	
 	<insert id="createAuth" parameterType="memberAuth">
 		insert into member_auth(
 			user_no, auth
 		)values(
 			#{userNo}, #{auth}
 		)
 	</insert>
 	
 	<select id="list" resultType="memberVO">
 		select
 			user_no, user_id, user_pw, user_name, reg_date
 		from member
 		order by user_no desc
 	</select>
 	
 	**<!--  한명의 회원과 join을 통한 해당 회원의 여러개의 역할을 가져와야함 --> 
  <!-- 
			MEMBE 와 MEMBER_AUTH 테이블에서 한 회원이 해당하는 여러개의 역할을 가져와야 하기
			때문에 member 기준 outer join을 해서 result로 보내야하는데 memberVO 타입으로 보낼 수 
		  없기 때문에 resultMap 을 이용함 상단 참고
   -->**
 	<select id="read" parameterType="int" resultMap="memberMap">
 		select
 			m.user_no, user_id, user_pw, user_name, reg_date, upd_date, auth
 		from member m left outer join member_auth a on(m.user_no = a.user_no)
 		where m.user_no = #{userNo}
 	</select>
 </mapper>

JSP 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="<https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js>"></script>
</head>
<body>
	<h2>Read</h2>
	<table>
		<tr>
			<td>userId</td>
			<td>${member.userId }</td>
		</tr>
		<tr>
			<td>userName</td>
			<td>${member.userName }</td>
		</tr>
		<tr>
			<td>auth - 1</td>
			<td>${member.authList[0].auth }</td>
		</tr>
		<tr>
			<td>auth - 2</td>
			<td>${member.authList[1].auth }</td>
		</tr>
		<tr>
			<td>auth - 3</td>
			<td>${member.authList[2].auth }</td>
		</tr>
	</table>
	<form action="/crud/mebmer/remove" method="post" id="delForm">
		<input type="hidden" name="userNo" value="${member.userNo }">
	</form>
	<button type="button" id="btnModify">Modify</button>
	<button type="button" id="btnRemove">Remove</button>
	<button type="button" id="btnList">List</button>
</body>
<script type="text/javascript">
$(function(){
	var btnModify = $("#btnModify");
	var btnRemove= $("#btnRemove");
	var btnList = $("#btnList");
	var delForm = $("#delForm");
	
	// 수정 버튼 클릭 시 이벤트
	btnModify.on("click", function(){
		delForm.attr("action", "/crud/member/modify");
		delForm.attr("method", "get");
		delForm.submit();
	});
	
	// 삭제 버튼 클릭 시 이벤트
	btnDelete.on("click", function(){
		if(confirm("정말로 삭제하시겠습니까?")){
			delForm.submit();
		}
	});
	// 목록 버튼 클릭 시 이벤트
	btnList.on("click", function(){
		location.href = "/crud/member/list";
	});
})
</script>
</html>

회원 상세보기 눌렀을 때 조서흐이 라는 사람의 역할은 한개 이기 때문에 한개가 뜬것을 확인 할 수 있다.

Untitled