분류 전체보기 210

20220218 개발일지 #클론코딩 엔티티 설계하기

오늘부터 새로운 프로젝트를 시작한다. 처음에 cgv 예매를 하려고 했는데 엔티티를 설계하는데 복잡해져서 주제를 바꾸기로 했다. 몇 개가 후보로 나와서 사다리를 돌렸고, 마켓컬리를 하기로 했다. 메인페이지와 상세페이지, 장바구니 페이지를 만들고 상품을 장바구니에 담고 주문하기 버튼을 누르면 주문하기 테이블에 담는 것 까지 하기로 했다. 추가로 가능하다면 포토리뷰를 작성하는 것을 하기로 했다. 먼저 설계한 엔티티 구조는 다음과 같다. 처음에 ProductInCart와 ProductInOrder을 따로 만들었는데 내용이 거의 똑같아서 고민이 있었다. 저녁에 ERD 세션이 있었는데, 질문에서 좋은 팁을 얻을 수 있었다. ProductInCart에 state라는 Column을 추가해서 장바구니에 담긴 상태에서는 ..

20220217 #미니프로젝트2 마무리

오늘로 프론트와 처음 진행한 미니프로젝트가 마무리되었다. 전반적으로 백엔드 진행속도가 빨라서 추가로 틈틈히 공부할 수 있었다. JPA 책으로 공부를 시작했는데 책에 설명이 잘되어있어서 따라가기에 많이 어렵진 않았다. 사실 시간이 난 만큼 더 공부를 했으면 좋았을텐데, 너무 피곤해서 많이 공부하지는 못한 것 같아서 아쉽다. 한편으로는 항해 끝날때까지 컨디션 관리도 해야하는데 그 중간을 조절하기가 쉽지 않은 것 같다. 프론트와 처음 작업하면서 협업도 처음이었지만, 서로 기술적인 부분에서도 이해가 전혀 없어서 작업을 진행하는게 쉽지 않았다. 정말 작업하면서 리액트를 공부해야하나, 라는 생각도 들었다. 그래도 우리 팀원들이 다들 잘해줘서 무사히 잘 마칠 수 있었던 것 같다. 특히 로그인 부분을 급하게 수정했는데..

20220216 개발일지 #JWT 구현 정리

프론트에서 로그인 작업을 빨리 끝내주셔서 금방 회원가입/로그인을 테스트해볼 수 있었다. 다행히 큰 이슈 없이 잘 작동하는 것을 확인할 수 있었다. 헤더에 보낸 토큰이 프론트에서 안보이는 문제가 있었는데, cors를 수정해서 해결했다. 특히 exposeHeaders("Authorization")은 반드시 포함해야한다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("") .allowedMethods("GET", "POST", "PUT", "DEL..

20220215 개발일지 #세션? JWT?

어느 정도 기능 구현은 완료한 상태이고, 로그인 후 요청 시 인증이 안되는 부분은 우선 프론트에서 작업하고 계셔서 낮에는 조금 여유가 있었다. 오전에는 반 비몽사몽으로 있었던 것 같고 오후에는 자바와 스프링도 조금 봤다. cs스터디하고 나서 JWT 토큰 방식이 궁금해서 다른 팀원분들께 물어봤는데 다들 잘 알려주셔서 많이 배울 수 있었다. 프론트에서 header에 세션아이디를 토큰 처럼 보내주셨다. 그 뒤에도 여전히 인증이 안되는 문제가 있어 찾아봤는데 samesite 문제인 것 같았다. (참고자료: https://yousrain.tistory.com/23) 한참 검색하다가 어떻게 방법을 찾긴 했는데, 또 다른 문제에 봉착했다... none으로 설정할 경우 secure을 속성에 추가해야 하고, 이경우 HT..

20220214 개발일지 #Spring security 아키텍처 공부하기

현재 로그인은 기본적으로 controller에 구현되어 있고(로직들이 controller에 너무 많이 들어가 있는 것 같아서 서비스에서 구현되도록 리팩토링했다.), 아마 authenticationManager가 인증하면서 코드에는 보이지 않지만 AuthenticationProvider ~ DB에서 User를 찾아서 UserDetails에 담아 리턴하는 것까지 이루어지는 것 같다. 여기서도 보면 UsernamePasswordAuthenticationFilter를 통해 Authentication Manager로 연결되고 이후 로직들이 처리되는 것을 볼 수 있다. (참고자료: https://webfirewood.tistory.com/115) formLogin을 Disable한 상태고 별도로 Filter를 커스..

20220212 개발일지 #스프링 시큐리티 세션 토큰으로 보내기

시큐리티를 우선 세션으로 하기로 했는데, 시큐리티는 기본적으로 formLogin방식이었다. 프론트 코드를 함께 보면서 얘기를 해봤는데 form이 아닌 json으로 로그인 값을 받아야 할 것 같았다. (axios는 서버 url 입력하는 부분이 있었는데, form은 그 부분이 없어서 어떻게 서버와 연결해야하는지 잘 모르겠다고 하셨다.) 그래서 시큐리티 설정의 formLogin을 disable로 하고 json으로 받는 방식으로 변경하였다. json으로 받기 위해서 LoginDto를 새로만들고 UsernamePasswordAuthenticationFilter를 상속받아 custom 클래스를 만들었다. LoginDto도 새로 만들어서 Filter가 가로챈 값을 넣어주었다. public class CustomUse..

#CORS 설정하기

#SOP(Same-Origin Policy) 같은 Origin에만 요청을 보낼 수 있게 제한하는 보안 정책 Origin의 구성 URI Schema(ex. http, https) Hostname(ex. localhost, naver.com) Port(ex. 80, 8080) 이 중에 하나라도 구성이 다르면 SOP 정책에 걸림! #CORS(Cross-Origin Resource Sharing) 서로 다른 Origin끼리 요청을 주고 받을 수 있게 정해둔 표준 1. Annotation 이용하기 origins, methods, maxAge, allowedHeaders를 각각 지정할 수 있다. 메소드에도 지정가능. @GetMapping("/api/get") @CrossOrigin(origins = "*", all..

서버/Spring boot 2022.02.12

20220212 개발일지

오늘부터 프론트와 새로운 미니프로젝트에 들어간다. 계속 스프링 + html 위주로 구현을 해와서 어떻게 프론트와 붙는 건지 아직 잘 이해가 되지 않는다. 회원가입을 어떻게 구현할지 고민이 많았는데, security에 자신이 없어서 기본 세션만 사용을 하고 다른 기능에 좀 더 집중하기로 했다. 우선 회원가입쪽 기능 구현은 완료하고 내일 프론트와 테스트로 붙여보기로 했다. signup은 json으로 받아도 되는 것 같아서 그렇게 했고, 로그인은 form으로만 가능한 것 같다고 다른 분들이 알려주셔서 우선 이렇게 해보기로 했다. signup을 처음에 form으로 받을 때 계속 에러가 났는데, SignupDto에 @Setter를 붙여서 해결했다. 오랜만에 git을 사용해서 깃도 계속 햇갈리는 것 같다. 테이블 ..

20220210 개발일지 #ErrorCode구현하기

오늘은 에러코드를 구현하였다. Spring security쪽 에러는 처리하지 못하고 그외 다른 exception으로 처리한 부분을 모두 ErrorCode로 정리해주었다. #ErrorCode 다음과 같이 각 에러마다 HttpStatus값을 지정하고 에러코드와 메세지를 입력하였다. @Getter public enum ErrorCode { // 400 Bad Request INVALID_MIN_ORDER_PRICE(HttpStatus.BAD_REQUEST, "400_1", "1,000원 ~ 100,000원 사이를 입력해주세요."), TYPE_ERROR_MIN_ORDER_PRICE(HttpStatus.BAD_REQUEST, "400_2", "100원 단위로 입력해주세요."), INVALID_DELIVERY_FE..

20220209 개발일지 #MVC Test

어제 구현한 RestaurantMvcTest에 이어 FoodMvcTest와 OrderMvcTest를 만들었다. RestaurantMvcTest에 조금 변형만 하면 되는 거라서 금방 될 줄 알았는데 에러를 해결하는데 생각보더 훨씬 시간이 걸렸다. FoodMvcTest를 작성할 때 음식 등록 api에서 400에러가 발생하였다. 권한 설정으로 발생하는 403 에러가 아니라서 처음에는 서비스 로직을 의심했다. 혹시 리팩토링을 하면서 문제가 생겼는지 확인했는데, arc에서 잘 돌아가는 것을 확인했다. 그래서 restaurantId가 pathvariable로 들어가는데 restaurant를 생성하지 않아서 발생한 에러라고 생각했다. 다른 test code들을 확인하면서 음식점을 등록하는 테스트를 먼저 만들어주고, ..