-
[Numble 챌린지] Spring으로 타임딜 서버 구축하기 - 상품 등록Project 2023. 3. 8. 09:05
회원 관리 및 로그인 세션을 완료하였으니 상품 관리를 진행해보자.
상품 등록을 하기 위해서는 다음과 같은 조건을 가진다.
- 로그인 된 상태
- ADMIN 권한을 가진 Member
위의 조건을 확인하기 위해서는 세션에 등록되어 있는 회원 정보를 가져올 필요가 있다.
다만 기존에 진행했던 코드에서는 Session에서만 등록을 했는데, postman에서 테스트 하기 위해서는 cookie 값이 필요할 것 같다. 따라서 MemberService를 수정을 해준다.
Entity
@Entity @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class Item { @Id @GeneratedValue Long id; String itemName; int price; int stock; @ManyToOne(fetch = FetchType.LAZY) Member member; }
하나의 멤버가 여러 개의 상품을 가질 수 있으므로 다 대 1의 관계를 맺어준다.
Controller
@PostMapping("") public ResponseEntity<?> createItem( @RequestBody ItemDto itemDto, HttpServletRequest request, @CookieValue(name = "uuid", required = false) Cookie cookie) { log.info(String.format("상품 등록")); return itemService.createItem(itemDto, request, cookie); }
@CookieValue를 통해 HttpServletRequest에서 cookie를 꺼내지 않아도 가져올 수 있다. 단일 Cookie 값이 필요할 때 유용한 것같다.
MemberService
public ResponseEntity<?> login( HttpServletRequest request, LoginRequestDto loginRequestDto, HttpServletResponse response) { if (!validatorMember(loginRequestDto.getMemberId())) { return ResponseEntity.fail("회원 정보가 없습니다."); } Optional<Member> member = memberRepository.findByMemberId(loginRequestDto.getMemberId()); if (!member.get().getPassword().equals(loginRequestDto.getPassword())) { log.info(String.format("회원 비밀번호 : %s, 요청 비밀번호 : %s", member.get().getPassword(), loginRequestDto.getPassword())); return ResponseEntity.fail("비밀번호를 틀렸습니다."); } // 로그인 성공 처리 // 세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성 HttpSession session = request.getSession(); MemberResponseDto memberResponseDto = new MemberResponseDto(member); String uuid = UUID.randomUUID().toString(); // 세션에 로그인 회원 정보 보관 session.setAttribute(uuid, memberResponseDto); // 쿠키에 저장 Cookie cookie = new Cookie("uuid", uuid); response.addCookie(cookie); log.info(String.format("로그인 정보 확인 : memberId = %s", member.get().getMemberId())); return ResponseEntity.success("로그인 성공"); }
확실하게 unique한 값을 보장해 주기 위해서 uuid를 사용하여 session 및 cookie에 저장해 주었다.
ItemService
public ResponseEntity<?> createItem(ItemDto itemDto, HttpServletRequest request, Cookie cookie) { HttpSession session = request.getSession(false); if (cookie == null) { return ResponseEntity.fail("로그인이 필요합니다."); } MemberResponseDto findMember = (MemberResponseDto) session.getAttribute(cookie.getValue()); Optional<Member> member = memberRepository.findByMemberId(findMember.getMemberId()); if (member.get().getRole() == Role.USER) { log.info(String.format("상품 등록: 회원 권한 = %s", member.get().getRole())); return ResponseEntity.fail("상품 등록 권한이 없습니다."); } Item newItem = Item.builder() .itemName(itemDto.getItemName()) .price(itemDto.getPrice()) .stock(itemDto.getStock()) .member(member.get()) .build(); Item savedItem = itemRepository.save(newItem); log.info(String.format("상품 등록 완료: Item Name = %s", savedItem.getItemName())); return ResponseEntity.success(savedItem, "상품 등록 완료"); }
나는 session에 저장할 때 비밀번호는 보호해야 한다 생각을 해서 Member를 바로 저장하기 보다는 Dto를 사용하여전달하였다.
따라서 받을 때도 Dto를 통해 받고 다시 Member 객체를 호출한다.
Test in Postman
postman을 통해 테스트를 진행했는데, 쿠키 값을 공유해주기 위해 오랜시간 삽질을 한 것 같다.
이 방법이 정답은 아닌 거 같지만 우선적으로 가능했던 방법을 공유해 본다.
회원가입을 진행하고,
로그인을 하면 cookie에 uuid가 생성된다.
이제 저 uuid를 item 생성할 때 공유해 줘서 ADMIN 유저가 Item을 등록할 수 있도록 해줘야 한다.
Step 1. cookies click
send 의 아래에 보면 Cookies가 있다. 클릭하자.
Step 2. Add domain
먼저 도메인을 등록하자. 나는 local에서 테스트 했으므로 localhost:8080을 해줬다.
이제 회원가입과 로그인을 진행하면 위 사진처럼 cookie가 생성된다.
다만....여기서 많이 헤맸는데,
로그인을 하게 되면 Path에 /member라고 나온다.
나는 member와 item을 분리해놨는데, 위의 쿠키가 /member에서만 쓰이는 것 같다.
애초에 등록할 때 전역으로 하고 싶은데 아직 하는 법은 모르겠다.
좀 더 연구해보도록 하고 지금은 급한대로 수기로 수정하자.
위의 사진처럼 url을 수정해주고 Item 등록을 하게 되면
postman 과 log에서 상품 등록이 되었다고 찍힌다.
'Project' 카테고리의 다른 글
[실무로 배우는 빅데이터 기술] 실습 Chapter 02 - 리눅스 가상 머신 환경 구성 및 CentOS 설치 (0) 2023.05.17 [Numble 챌린지] Spring으로 타임딜 서버 구축하기 - Cloud DB for MySQL 생성 후 접 (0) 2023.03.09 [Numble 챌린지] Spring으로 타임딜 서버 구축하기 - 로그인 세션 구현 (0) 2023.03.06 [Numble 챌린지] Spring으로 타임딜 서버 구축하기 - nGrinder 설치(Guide) (0) 2023.03.05 [Numble 챌린지] Spring으로 타임딜 서버 구축하기 - 회원 삭제 (0) 2023.03.04