인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 웹 기능 - 조회

전체 회원 다 뜨는거 말고 원하는 아이디만 찾을떄 어떻게해야 할까요?

작성

·

137

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

 

 

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
  <form action="/members/find" method="post">
    <div class="form-group">
      <label for="name">찾기</label>
      <input type="text" id="name" name="name" placeholder="이름을 입력하세요">
    </div>
    <button type="submit">찾기버튼</button>
  </form>
</div> <!-- /container -->
</body>
</html>


find.html입니다.

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
  <div>
    <table>
      <thead>
      <tr>
        <th>#</th>
        <th>이름</th>
      </tr>
      </thead>
      <tbody>
      <tr th:each="member : ${members}">
        <td th:text="${member.id}"></td>
        <td th:text="${member.name}"></td>
      </tr>
      </tbody>
    </table>
  </div>
</div> <!-- /container -->
</body>
</html>

 

memberfind.html 입니다

 

memberController.java 입니다

    @GetMapping("members/find")
    public String find(MemberForm form) {
        return "members/find";
    }

    @PostMapping("members/find")
    public String find(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberfind";
    }
}

 

List<Member> members = memberService.findMembers();

여기 부분을

List<Member> members = memberService.findOne();
으로 바꾸어야할텐데 ()-> 여기안에 매개변수를 뭘로 해야할까요

 

 

답변 1

0

안녕하세요. 이해욱님, 공식 서포터즈 OMG입니다.

제목에서는 id를 검색한다고 하셨는데, 작성하신 코드에서는 HTML에서 '이름을 검색하세요'로 이름을 통한 검색을 작성하셔서 '이름'기준으로 설명드리겠습니다.(id 검색은 name대신 id 기준으로 변경하시면 큰 틀에서는 차이가 없습니다 😀 )

강의에서 회원가입할 때와 마찬가지로 메서드의 인자인 MemberForm을 통해 원하는 (= 사용자가 입력한) 정보를 받아올 수 있습니다.

image

그리고 아래와 같이 form에서 가져온 name( = form.getName())을 findOne의 인자로 전달하면 됩니다.

 

@Controller
public class MemberController {

    @PostMapping("members/find")
    public String find(MemberForm form, Model model) {
        // 화면에서 입력한 이름을 가져와서 조회기능의 service클래스 메서드로 전달
        List<Member> members = memberService.findOne(form.getName());
        model.addAttribute("members", members);
        return "members/memberfind";
    }
}

조회 기능을 담당하는 memberService의 findOne()과 repository에서 입력한 이름만을 필터하여 조회하는 기능을 구현해보시면 학습에 많은 도움이 되실거에요 😀 

감사합니다.

전체 회원 목록이 아닌 특정 name만 아이디가 있는지 검색하는 기능을 만들려고 하는데

@PostMapping("members/find")
public String find(MemberForm form, Model model) {
    List<Member> members = memberService.findOne(form.getName());
    model.addAttribute("members", members);
    return "members/memberfind";
}

이렇게 하면 에러가뜹니다.

MemberService클래스의 findOne()은 직접 구현하셔야 합니다.

마찬가지로 DB에서 데이터를 조회하는 기능을 담당하는 MemberRepository도 특정 name만 검색하는 기능을 별도로 구현하셔야 합니다.

구현한 코드를 공유해주시겠어요?

MemberService 에는 이미 findOne()이 구현되어있습니다

public Optional<Member> findOne(Long memberId){
    return memberRepository.findById(memberId);
}

그리고 MemberRepository 에서도

@Override
public Optional<Member> findByName(String name) {
    return store.values().stream()
            .filter(member->member.getName().equals(name))
            .findAny();
}

특정 name을 검색하는 기능이구현되어있구요

MemberController 에서 findByName 이 구현되어있구요

 

@PostMapping("members/find")
public String find(MemberForm form, Model model) {
    List<Member> members = memberService.findMembers();
    model.addAttribute("members", members);
    return "members/memberfind";
}

이 부분에서 List<Member> members = memberService.findOne(매개변수); 여기서 매개변수 부분만 수정하면될거같은데

어떻게해야 할가요

image

반환 타입을 보면 Optional<Member>로 되어 있습니다.

올리신 이 두 코드를 그대로 사용한다면 MemberController의 코드를 변경해야합니다.

아래와 같이 변경해보시겠어요?

@PostMapping("members/find")
public String find(MemberForm form, Model model) {
    // 화면에서 입력한 이름을 가져와서 조회기능의 service클래스 메서드로 전달
    Optional<Member> members = memberService.findOne(form.getName());
    model.addAttribute("members", members.get());
    return "members/memberfind";
}
public Optional<Member> findOne(String name) {
    return memberRepository.findByName(name);
}

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기