코딩기록 저장소 🐕/스스로 프로젝트와 연습

프로젝트(SpringBoot)에 JPA적용해보기5 🤤

kimkongmom 2024. 5. 20. 12:34

 

 

 

 

오늘은 회원 수정을 해보려고합니다.(난이도 ⭐⭐⭐)

 

JPA가 아직 서툴다보니 수정에서 시간이 꽤 걸렸습니다. 강의를 더 사서 들어봐야하나🥲

 

 

✏️Repository(수정)

EntityManager의 createQuery() 메서드를 사용하여 update쿼리를 작성했습니다.

찾아보니 @Modifying 어노테이션을 사용하여 수정을 많이 하는것같더라구요 좀 더 공부해서 적용해보겠습니다

public int update(Member member) {
    return em.createQuery("update Member m set m.name = :name, m.age = :age, m.pw = :pw where m.id = :id")
           .setParameter("name", member.getName())
           .setParameter("age", member.getAge())
           .setParameter("pw", member.getPw())
           .setParameter("id", member.getId())
           .executeUpdate();
}

 

아이디를 찾는 쿼리

public List<Member> findById(Long id){
    return em.createQuery("select m from Member m where m.id = :id", Member.class)
           .setParameter("id", id)
           .getResultList();
}

 

✏️Service(수정)

update에서도 @Transactional은 필수입니다!

lombok에 builder를 사용해서 받아와줍니다. 다른방법을 찾다가 결국 builder의 힘을 빌렸습니다.

@Transactional
@Override
public void modifyMember(HttpServletRequest request) {
    Long id = Long.parseLong(request.getParameter("id"));
    String name = request.getParameter("name");
    int age = Integer.parseInt(request.getParameter("age"));
    String pw = request.getParameter("pw");

    Member member = Member.builder()
           .id(id)
           .name(name)
           .age(age)
           .pw(pw)
           .build();

    int modifyResult = memberRepository.update(member);

    if (modifyResult == 1) {
        HttpSession session = request.getSession();
        Member sessionMember = (Member) session.getAttribute("member");
        sessionMember.setName(name);
        sessionMember.setAge(age);
        sessionMember.setPw(pw);

    }
    new ResponseEntity<>(Map.of("modifyResult", modifyResult), HttpStatus.OK);

}

 

✏️Controller(수정)

 

GetMapping수정페이지

페이지 이동할때 아이디가 넘어와야하기 때문에

Repository클래스에서 아이디를 가져오는 메서드(findById)가 필요합니다!

@GetMapping(value ="/modifyMember")
public String modifyMemberForm(Model model, Long id){
    List<Member> members = memberRepository.findById(id);
    if (!members.isEmpty()) {
        model.addAttribute("member", members.get(0));
    } else {
        throw new NoSuchElementException("Member not found with id: " + id);
    }
    return "members/modifyMember";
}

 

 

PostMapping수정페이지

@PostMapping(value ="/modifyMember")
public void modifyMember(HttpServletRequest request){
    memberService.modifyMember(request);
}

 

 

✏️Html(수정)

 

수정페이지로 넘어갈때 id를 파라미터로 넘겨줍니다.

<a th:href="@{members/modifyMember(id=${session.member.id})}">회원수정</a>

 

 

수정페이지 th:value로 수정할값을 작성합니다.

<form method="post" th:action="@{/members/modifyMember}">
      <label for="name">이름</label>
      <input type="text" th:value="${session.member.name}" name="name" id="name" class="form-control">

      <label for="age">나이</label>
      <input type="number" th:value="${session.member.age}" name="age" id="age" class="form-control">

      <label for="pw">비밀번호</label>
      <input type="password" th:value="${session.member.pw}" name="pw" id="pw" class="form-control">

      <input type="hidden" th:value="${session.member.id}" name="id" id="id">
      <button type="submit">정보수정하기</button>
</form>