1. 화면 확인
2. 회원 수정 쿼리 작성 (더티 체킹)
@RequiredArgsConstructor @Repository public class UserRepository { private final EntityManager em; public User findById(int id) { User user = em.find(User.class, id); return user; }
User에는 연관된 테이블이 없기 때문에 이건 굳이 테스트해보지 않아도 되지만
em.find를 사용하더라도 연관된 테이블이 있다면 꼭!! 테스트 해보자!!
FK에 걸려있다면 와아아악 다 들고 오기 때문에 ← 이런 경우에는 체크 필요!
3. 회원 수정 쿼리 테스트 (더티 체킹 테스트)
@Import(UserRepository.class) //IoC 등록 코드 @DataJpaTest //Datasource/(connection pool), EntityManager public class UserRepositoryTest { @Autowired //애를 걸면 userRepository를 DI 걸 수 있다. 테스트라 new가 안 된다는 듯 private UserRepository userRepository; @Test public void findById_test() { //given int id = 1; //when userRepository.findById(id); //then }
[ UserController - update-form ]
@GetMapping("/user/update-form") public String updateForm(HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); //id는 세션에서 들고 오자! //세션이 있는 정보를 머스태치에 뿌리니까 해당 유저의 정보만 나오겠지! User user = userRepository.findById(sessionUser.getId()); request.setAttribute("user", user); return "user/update-form"; }
세션 유저는 Value Object
[ User - update-form.mustache ]
password에 value를 주면???? 내 비밀번호 개봉박두 !!
이렇게 수정해주자!
<div class="card"> <div class="card-header"><b>회원수정을 해주세요</b></div> <div class="card-body"> <form action="/user/update" method="post" enctype="application/x-www-form-urlencoded"> <div class="mb-3"> <input value="{{user.username}}" type="text" class="form-control" placeholder="Enter username" disabled> </div> <div class="mb-3"> <input type="password" class="form-control" placeholder="Enter password" name="password"> </div> <div class="mb-3"> <input value="{{user.email}}" type="email" class="form-control" placeholder="Enter email" disabled> </div> <button type="submit" class="btn btn-primary form-control">회원가입수정</button> </form> </div> </div> </div>
수정할 것만 name 값을 받으면 되기 때문에
password를 제외한 나머지는 name값을 지워줬다.
세션에서 where절을 걸 수 있는 id를 가지고 있으니까 /user/{{id}}/update 안 씀!
[ 화면 확인 ]
[ UserController - update ]
@RequiredArgsConstructor @Controller public class UserController { private final UserRepository userRepository; private final HttpSession session; @PostMapping("/user/update") public String update(String password) { return "redirect:/"; }
password 1개만 바뀌니까 DTO 로 굳이 받지 않아도 된다!
마이 페이지 url에 id 들고 올 필요가 있을까? → NO
1번 유저를 수정하는 페이지로 가려고 할 때, 이렇게 id를 들고 오지 않아도 된다!
→ 세션 값에서 id 찾아서 들고 오면 된다.
→ 그럼 굳이 이렇게 번호를 들고 오지 않아도 된다!
→ 즉, 마이페이지 같은 경우는 이렇게 들고 올 필요가 없다!
이렇게 쓰면 된다!
사용자가 '내 정보 수정' 페이지로 갈 때, 우리는 세션에서 사용자가 누구인지 알 수 있다. 그래서 사용자의 ID를 URL에 쓸 필요 없이, 바로 그 사용자의 정보를 가져와서 수정할 수 있게 해준다.
사용하지 않는 이유!
1. 보안 URL에 사용자의 ID를 포함시키면, 누군가가 이 URL을 복사하거나 기록할 수 있다. 이는 사용자의 ID가 외부에 노출될 가능성이 있으며, 이는 보안상 좋지 않다. 반면, 세션을 사용하면 사용자의 ID 정보가 서버 측에서만 관리되므로, 이러한 노출 위험이 줄어든다! 2. UX 사용자가 자신의 프로필이나 설정을 수정하고 싶을 때, 별도의 ID를 기억하거나 입력할 필요 없이 바로 접근할 수 있다
Share article