09009

[Spring Boot] 회원 연습 (5) - 회원 목록 출력하기, 상세조회 본문

Back-End/Spring
[Spring Boot] 회원 연습 (5) - 회원 목록 출력하기, 상세조회
09009 2024. 1. 22.

회원 목록 출력

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
  <h2>Hello Spring Boot!!</h2>
  <a href="/member/save">회원가입</a>
  <a href="/member/login">로그인</a>
  <a href="/member/">회원목록</a>
</body>
</html>

 

MemberController

    @GetMapping("/member/")
    public String findAll(Model model) {
        List<MemberDTO> memberDTOList = memberService.findAll();
        // 어떠한 html로 가져갈 데이터가 있다면 model을 사용한다.
        model.addAttribute("memberList", memberDTOList);
        return "list";
    }

 

MemberService

!! 중요 : repository에 관련된 것은 무조건 entity 객체로 주고받게 된다

 

!! 지금까지 entity 객체를 dto로 변환하는 작업은 entity가 하나고 dto 하나로 변환할 때 사용하는 것

이제는 entity가 여러 개 담긴 리스트 객체를 dto가 여러 개 담긴 리스트 객체로 옮겨 담아야 한다.

    public List<MemberDTO> findAll() {
        // findAll() -> repository가 제공해주는 메서드
        // !! 중요 : repository에 관련된 것은 무조건 entity 객체로 주고받게 된다 -> 컨트롤러로 보내려면 dto로 변환해야함
        List<MemberEntity> memberEntityList = memberRepository.findAll();

        // 담아갈 객체를 생성
        List<MemberDTO> memberDTOList = new ArrayList<>();
        // memberEntityList에 있는 것을 하나하나 꺼내서 memberDTOList 하나하나씩에 옮겨 담는 과정이 필요하다
        for (MemberEntity memberEntity : memberEntityList) {
            // memberDTOList : dto 객체를 담기 위한 리스트
            memberDTOList.add(MemberDTO.toMemberDTO(memberEntity));
//            MemberDTO memberDTO = MemberDTO.toMemberDTO(memberEntity);
//            memberDTOList.add(memberDTO);
        }
        return memberDTOList;

    }

 

list.html 생성

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>list</title>
</head>
<body>
<h2>list.html</h2>
<table>
    <tr>
        <th>id</th>
        <th>memberEmail</th>
        <th>memberPassword</th>
        <th>memberName</th>
        <th>상세조회</th>
        <th>삭제</th>
    </tr>
    <!-- memberList: 리스트, member: 임의로 지정한 각각 변수 -->
    <tr th:each="member: ${memberList}">
        <td th:text="${member.id}"></td>
        <td th:text="${member.memberEmail}"></td>
        <td th:text="${member.memberPassword}"></td>
        <td th:text="${member.memberName}"></td>
        <td>
            <a th:href="@{|/member/${member.id}|}">조회</a>
        </td>
        <td>
            <a th:href="@{|/member/delete/${member.id}|}">삭제</a>
        </td>
    </tr>
</table>
</body>
</html>

 

조회, 삭제 버튼은 나중에 

여기까지 코드 작성하고 실행해보기


회원 상세 조회

 @{| |} : 타임리프에서 지원하는 문법, 경로 상에 model값 (서버에서 가져오는 데이터)을 같이 표현하고자 할 때 사용

 

MemberController

@PathVariable : rest api와 같은 주소 체계 (ex : /member/1 )를 사용할 때는 이 어노테이션을 사용한다.

    @GetMapping("/member/{id}")
    public String findById(@PathVariable Long id, Model model) {
        MemberDTO memberDTO = memberService.findById(id);
        model.addAttribute("member", memberDTO);
        return "detail";
    }

 

MemberService

optional 객체를 get()으로 entity 객체로 변환 → entity 객체를 dto로 변환해서 컨트롤러에 넘겨줘야하는게 원리

    public MemberDTO findById(Long id) {
        Optional<MemberEntity> optionalMemberEntity = memberRepository.findById(id);
        if (optionalMemberEntity.isPresent()) {
            // dto로 변환시켜서 컨트롤러에 넘겨줘야함
//            MemberEntity memberEntity = optionalMemberEntity.get();
//            MemberDTO memberDTO = MemberDTO.toMemberDTO(memberEntity);
//            return memberDTO;
            return MemberDTO.toMemberDTO(optionalMemberEntity.get());
        } else {
            return null;
        }
    }

 

detail.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>detail</title>
</head>
<body>
<table>
    <tr>
        <th>id</th>
        <th>email</th>
        <th>password</th>
        <th>name</th>
    </tr>
    <tr>
        <td th:text="${member.id}"></td>
        <td th:text="${member.memberEmail}"></td>
        <td th:text="${member.memberPassword}"></td>
        <td th:text="${member.memberName}"></td>
    </tr>
</table>
</body>
</html>