Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- toLowerCase()
- StringBuilder
- isuppercase()
- 프로그래머스 레벨1
- 자바 최소공배수
- 베주계수
- 스프링뼈대
- git 컨벤션
- 스프링
- while과 two-pointer
- ineer join
- 최대공약수
- string과 stringbuilder
- 동일성과 동등성
- 자바 유클리드
- stringbuilder의 reverse()
- sql 데이터형 변환
- addDoc
- islowercase()
- 유클리드호제법
- 자바 스트링
- 모던자바
- 스프링환경설정
- Git사용법
- 자바 최대공약수
- 래퍼타입
- 최대공약수와 최소공배수
- 최소공배수
- replaceAll()
- string
Archives
- Today
- Total
주노 님의 블로그
20240830 본캠프 35일차 TIL 본문
본캠프 35일차 내용 간단요약
- 09:00 ~ 10:00 : 코드카타
- 10:00 ~ 10:10 : 팀 회의
- 10:10 ~ 12:00 : 개인 과제 리팩토링
- 12:00 ~ 13:00 : 점심시간
- 13:00 ~ 14:00 : cs공부
- 14:00 ~ 18:00 : 강의
숙련 2주차 14강 ~ 23강 - 18:00 ~ 19:00 : 저녁시간
- 19:30 ~ 20:30 : 튜터님 인터뷰 및 TIL 작성
오늘 해야할 일 ✔️ 🔺 ❌
✔️개인 과제 피드백 반영 리팩토링
✔️ 숙련 2주차 강의듣기
휴~ 여유여유~
강의
더보기
지금까지 배웠던 내용을 총 집합해서 myselectshop 을 만들어보자
요구사항
- 상품 검색 (네이버 쇼핑 api 사용)
- 관심 상품 등록
- 관심 상품의 희망 최저가 설정
- 관심 상품 조회하기
관심상품
- 관심상품 api
- 관심상품 api설계를 위 한 준비
1. db상품 테이블에 대응되는 entity
2. timestamped 설계 - 상품 등록하기
1. controller : postMapping으로 상품 등록 및 requestBody로 입력받음
2. service : save메서드 사용 - 상품의 희망 최저가 업데이트
접근방법 : 기존 등록된 db에서 put매핑을 통해 내 희망 최저가만 업데이트
1. controller : id를 pathvariable로 받고 수정할 데이터를 requestBody로 받는다
2. service : entity의 update메서드를 만들어 값을 수정해줌
3. entity : entity에 메서드를 만들어 희망가격을 설정해줌 - 관심상품조회
getmapping으로 조회하며 list로 받아온다
1. controller : getmapping으로 하며, list에 담아서 반환한다
2. service : findAll과 stream을 사용하여 받아온다
스케줄러
- 요구사항
매일 새벽 1시에 관심 상품을 검색해서 최저가 정보를 업데이트하는 스케쥴러 만들기 - 스케줄러를 위한 준비
1. scheduler 클래스 생성
@scheduled 어노테이션 사용 및 @springBootApplication 어노테이션이 있는곳에서
@EnableScheduling을 해줘야한다
초 분 시 일 월 주 순서로 반복되며// 초, 분, 시, 일, 월, 주 순서 @Scheduled(cron = "0 0 1 * * *") // 매일 새벽 1시
해당 시간이 된다면 아래의 메서드를 수행한다
리스트를 돌면서 해당아이템의 첫번째의 가격을 받아와서 업데이트하는 로직이다
회원 기능 구현
- 회원 기능 api설계
- 회원 기능 구현을 위한 준비
entity > user 설계
entity > userRoleEnum 설계 : 권한을 위한 enum클래스
security 설정
기존에는 쿠키로 보내서 저장을 했다.
지금은 헤더에 보내고 헤더로 받아본다.
jwt 사용흐름
1. 클라이언트가 로그인 성공
2. 서버에서 jwt로 암호화 하여 응답 헤더에 담아 클라이언트에 전달한다
3. 클라이언트에서 jwt를 저장한다.
다시 보낼때
1. 클라이언트가 헤더에 jwt를 넣어 보낸다
2. 서버는 위조 여부 검증 및 유효기간 검증을 한다.
security > userDetailsImpl : 유저의 정보를 담는 클래스이다
security > userDetailsServiceImple : 유저를 검증하는 클래스이다
security > JwtAuthenticationFilter : 로그인 인증 관련 클래스이다
로그인에 성공하면 jwt토큰을 헤더에 보내준다.
security > JwtAuthorizationFilter : 로그인 인가 관련 클래스이다,
dto > loginRequestDto : 로그인 요청 dto이다
config > WebSecurityConfig : 스프링 security 설정및 인증/인가관련 필터를 정의해놓은 클래스이다.
security : - 로그인 페이지
controller : @GetMapping으로 로그인 페이지로 보냄 - 회원가입 페이지
controller : @GetMapping으로 회원가입 페이지로 보냄 - 회원가입
controller : @PostMapping으로 회원가입을 요청하며, validation을통한 예외처리를 함.
회원 별 상품 api 구현
- 요구사항
이제 회원도 등록되었으니, 관심 상품 추가시 누구의 상품인지 등록이 필요함 - 관계
회원 1명이 여러개의 상품을 가질 수 있음
즉 1:n의 관계임
회원이 상품을 조회하는 경우는 없음. 단방향으로 해도될듯.
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user;
단방향이니 하나만 조회해도 된다
many는 eager이므로 lazy로 설정한다. - 상품 등록 코드 수정
controller : 회원 정보도 같이 줘야한다 @AuthenticationPrincipal 어노테이션에 있는 UserDetailsImpl을 이용한다.
service : user의 정보도 넣어줘야한다.
entity : 생성자에 user 정보를 넣어준다. - 상품 조회 코드 수정
controller : 회원 정보도 같이 줘야한다 @AuthenticationPrincipal 어노테이션에 있는 UserDetailsImpl을 이용한다.
service : repository에서 findAllByUser(user)을 하여 유저의 상품을 조회한다.
repository : findAllByUser메서드를 생성해준다, 구현은 하지 않아도된다., - admin계정을 위한 모든 회원들이 추가한 상품 목록을 조회하기
contoller : 모든 목록을 가져온다, 매개변수는 필요없다
service : findall을 사용한다.
상품 페이징 및 정렬
- 상품의 페이징 기능과 정렬을 구현한다
- 요구사항
페이징
page : 조회할 페이지 번호 1부터 시작
size : 한 페이지에 보여줄 상품 개수 10개로 고정
정렬
정렬항목 : id, title, lprice
오름차순 : true(오름차순 한다), false(내림차순) - spring data에서는 페이징 및 정렬기능을 제공한다.
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC; Sort sort = Sort.by(direction, sortBy); Pageable pageable = PageRequest.of(page, size, sort); Page<Product> products = productRepository.findAllByUser(user, pageable);
1. 정렬 방향을 결정함 (오름차순 , 내림차순)
2. 정렬 조건을 만듬
3. 페이지, 사이즈, 소팅방향으로 페이지 객체를 만듬
4. 특정 user과 연관된 항목을 가져온다. - 페이징 구현
controller : 관심 상품 조회하기에 RequestParam으로 page, size, sortBy, isAsc를 넣는다
service : 페이징 처리 코드를 추가한다
repository : 페이징을 매개변수로 넣은 findAllByUser메서드를 수정한다.
상품 폴더 설계
- 요구사항
폴더별로 관심상품을 추가 할 수 있게 바꾼다
회원별 폴더를 생성할 수 있다(1~N개) - 폴더 테이블 설계
폴더명, 회원id
관계 : 회원 1명이 폴더 여러개를 가질 수 있다,
단방향 연관관계로 설정을 한다
entity > folder 생성 - 상품과 폴더의 관계
상품 여러개는 폴더 여러개에 넣을 수 있다.
N:M이다.
상품과 폴더사이에 상품_폴더를 만들어서 N:M을 해소하자
폴더 생성 및 조회 구현
- 폴더 생성 및 조회 API
- 회원의 폴더 생성 로직
FolderController : 폴더 추가 로직을 구현 매개변수로, dto와 회원 정보를 가져오기위해 userDtetailsImpl을 받음
FolderService : 여러개의 폴더를 한꺼번에 저장할수있으니, repository에 이미 있는 폴더인지 조회를 하는 findAllByUserAndNameIn 메서드를 생성한다.
폴더가 없을 경우 폴더를 생성하고 saveAll메서드를 사용해 저장한다. - 회원이 저장한 폴더 조회 로직
userController : Model객체와 UserDeatils객체를 매개변수로 받는 폴더반환 메서드를 추가한다
folderService : 로그인한 회원을 받아 회원이 등록한 폴더를 모두 가져온다.
관심 상품에 폴더 추가 구현
- 관심상품에 폴더를 설정할 수 있다.
관심상품이 등록되는 시점에는 어느 폴더에도 저장되지 않는다, 관심상품별로 생성한 폴더에 선택해서 추가할 수 있다. - api 설계 및 구현
- 폴더 전체 조회
controller : getmapping으로 회원의 모든 폴더를 조회한다 - 관심 상품 폴더에 추가
controller : postmapping으로 pathvariable으로 productId를 받고, requestParam으로 folederId를 받아서 상품에 폴더 추가 로직을 구현한다.
service : 상품, 폴더, 회원의 소유인지 조회, 중복확인 로직을 거쳐 save메서드를 사용하여 추가한다
repositorty : 중복확인을 위해 findByProductAndFolder 메서드를 생성한다.
폴더 별 관심상품 조회 구현
- 요구사항
폴더 별 관심상품 조회가 가능하다.
조회방법
폴더별 : 폴더별 저장된 관심상품을 조회 한다
전체 : 폴더와 상관없이 모든 관심상품을 조회한다 - API설계
- 폴더 별 관심상품 조회
controller : folderId와 페이지, 사이즈, 정렬, 오름차순여부, 유저정보를 받아 회원이 등록한 폴더 내 상품을 조회한다.
service : 페이징 처리를 한뒤 해당 폴더에있는 상품을 가져온다
repository : findAllByUser이라는 메서드(전체 관심상품), findAllByUserAndProductFolderList_FolderId라는 메서드(회원의 폴더의 모든 상품 리스트)를 만들어준다.
'TIL' 카테고리의 다른 글
20240903 본캠프 37일차 TIL (0) | 2024.09.03 |
---|---|
20240902 본캠프 36일차 TIL (0) | 2024.09.02 |
20240829 본캠프 34일차 TIL (0) | 2024.08.29 |
20240828 본캠프 33일차 TIL (0) | 2024.08.28 |
20240827 본캠프 32일차 TIL (0) | 2024.08.27 |