목록Language/SpringBoot (14)
나의 개발일지
기존 코드의 리팩토링을 진행하던 과정에서 좋은 방법을 찾아냈습니다.Querydsl 의 활용법 중 Projections을 활용할 경우JPAQueryFactory에서 엔티티나 Tuple을 가져온 후 따로 DTO로 정제하는 과정을 거치는 방식이 아니라JPAQueryFactory에서 바로 임의의 DTO를 반환하도록 할 수 있다고 합니다.초보 개발자로서, 혹은 개발의 초기 단계에 Querydsl 내에서 Tuple을 사용할 일은 잘 없을 것이라고 생각합니다.Tuple의 경우 보통 JPAQueryFactory에서 엔티티나 한 변수 형태의 리스트 값을 받는 경우가 아니라 원하는 컬럼만을 지정해서 가져오는 경우에 사용됩니다.가령 회원이라는 엔티티가 있을 경우, 아이디, 비밀번호, 전화번호 중 아이디와 전화번호만 필요할 ..
프로젝트가 끝나고 다들 바쁜 시기입니다. 6 개월이라는 긴 수료기간에 지친 마음을 요양하는 시간을 가지는 분들도 있고, 취업 준비에 여념이 없는 분들도 있네요. 마음 같아선 좀 더 고도화를 진행해보고 싶지만 이러한 사정들로 어려워 보이기 때문에 개인적인 리펙토링만을 수행하고 있습니다. 리펙토링만 하는 것도 좋지만 재미가 없을 것 같더라구요. 테스트도 같이 진행해 보기로 했습니다. 통합 테스트와 단위 테스트 중 하나를 선택해야 하는 입장에 있어 팀원들과 진행할 수 없는 상황인 저에게는 다른 코드와의 의존성을 차단한 채로 순수하게 해당 기능만을 테스트해 볼 수 있는 단위 테스트를 선택했습니다. 저희는 Exception을 따로 정의하는 방식으로 사용하고 있습니다. RuntimeException을 상속받는 Ex..
백엔드 스쿨이 끝이 났습니다. 이제 모든 공부를 혼자서 진행해야 한다고 생각하니 낯섭니다. 옆에서 같이 공부하고 있는 사람도 없어 마음이 헤이해질까봐 두렵네요. 마음을 다잡기 위해서, 그리고 코드 복기를 위해서 테스트 코드를 작성 중에 있습니다. GetMapping 엔드 포인트들의 대한 테스트를 작성하는 과정에서 여러가지 오류가 많았습니다. AOP 허용 설정을 따로 해줘야 된다는 것은 꽤 충격적이었죠. 본 개발 환경에서는 기본 설정이라 필요 없지만 테스트 환경을 위해 Application 클래스 위에 @EnableAspectJAutoProxy(proxyTargetClass = true) 를 입력해줘야 한다니 주객이 전도된 기분입니다. 그리고 또 문제가 발생했습니다. 문제 기존의 401 는 권한이 없음을 ..
앞서 WebClient를 도입한 배경과 결과를 말씀드렸습니다. 아래와 같이 Service 클래스를 작성해뒀는데요. @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class TossService { private final WebClient webClient; private static String authorization; @Value("${custom.tossPayments.widget.secretKey}") private void setTossPaymentsWidgetSecretKey(String tossPaymentsWidgetSecretKey) { String encodedKey = Base64.getEncoder..
HotShare 1차 프로젝트 기간을 보내는데 있어 가장 공을 많이 들인 부분은 아무래도 토스페이먼츠인 것 같습니다 타 api 호출을 통한 시스템 구현을 오롯이 혼자 하는 건 처음이었으니요. 이미 수업 시간 중에 토스페이먼츠를 배운 전적이 있지만 큰 도움은 되지 않았던 것 같습니다. 그 이유는 온전히 저에게 있었습니다. rest api 에 대한 이해 부족 선수적인 리액트 학습 없이 next.js 환경에서 구현 이것 때문에 속 많이 썩었네요. 가장 힘든 부분은 next.js 였지만 사실 가장 쉬운 부분 또한 next.js였습니다. 제가 선수 지식이 부족해서였을 뿐 그렇게 어려운 내용은 아니었거든요. 백엔드를 위한 자바 코드도 할만했습니다. 토스페이먼츠는 개발자 문서가 잘 작성되어있고 샘플 코드도 언어별로 ..
HotShare 1차 프로젝트 기간을 진행하며 많은 것을 배웠습니다. 특히 제가 모르는 부분들을 다른 분들의 코드를 참고하는 시간은 각별했습니다. 그 중에는 PageImpl 과 PageRequest 라는 낯선 개념들도 등장했는데요. 실제로 어떤 역할을 하는지는 모르겠지만 우선 따라서 써본 결과 잘 작동하기 때문에 프로젝트 기간 동안에는 그러려니하고 넘어갔습니다. @GetMapping("/me") @MemberOnly public ResponseEntity showMyCashLogs( final Pageable pageable, @Auth final Accessor accessor ) { Long memberId = accessor.getMemberId(); Page cashLogs = cashLogSer..
get 과 post만을 활용하는 기존의 http의 통신 방식과는 다르게 REST API 환경에서는 put, delete, patch 를 추가로 사용합니다. REST API 서버를 운용하는게 아니라면 put, delete, patch 를 활용할 수 없기도 하고, post로 모든 부분이 대체가 가능하기 때문에 꼭 활용할 필요는 없지만 스프링부트에서는 hiddenmethod라는 기능을 지원합니다. 실제로 put, delete, patch 기능을 활용할 수 있게 되는 것은 아니고, post 요청이 날아가지만 이름만 delete 로 바뀐다고 이해하시면 됩니다. post를 활용하되 보이는 모습을 delete 로 바꿀 뿐이지만 개발자들의 입장에선 이 요청이 무엇을 위한 요청인지 확인하기 위한 가독성 확보 측면에 있어..
public class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf( csrf -> csrf .ignoringRequestMatchers("/h2-console/**") ) .headers( headers -> headers .addHeaderWriter( new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN) ) ) .authorizeHttpRequests( authorizeHttpRequests -> authorizeHttpRequests .reques..
최근 스프링부트을 TDD로 수행하는 방법을 배우고 있습니다. 스프링부트는 서버를 다루는 프레임워크인만큼 자바를 통해 작성한 코드를 정해진 규칙에 따라 DB명령문으로 변환해주는데요. 막상 변환된 모습을 볼 수 없으니 오류가 나도 어떤 부분이 어떻게 작동했는지에 대해 알 수가 없었는데 강사님께서 좋은 코드를 주셨습니다. spring: jpa: properties: hibernate: show_sql: true format_sql: true use_sql_comments: true 이 코드를 yml 파일에 기입해주면 저희가 실제로 날리는 DB쿼리를 확인해보실 수 있습니다. JPA가 실질적으로 실행하는 쿼리를 출력합니다
강의를 다시 들으며 천천히 강사님의 코딩을 따라가다가 아무리 만져도, 깃 체크아웃을 통해 과거로 돌려도 후로 돌려도 해결되지 않는 오류와 마주하고서 어쩔 수 없이 아예 통째로 지우고 강사님의 파일을 가져왔습니다. 그런데 강사님과는 다르게 Thymeleaf 문법 중 하나인 layout에 컴파일 에러 표시가 나네요. 막상 실행시키면 문제 없이 실행되기에 무시하고 진행해도 상관 없겠지만 신경쓰이는 건 어쩔 수 없어서 한참을 검색하다가 끝내 못 찾아서 보조 강사님께 여쭸습니다. Settings 에서 Unbound를 검색한 후 XML의 체크를 해제해주면 된다고 하시네요. 기억을 반추해보니 분명 강사님께서 알려주신 부분이긴 했었지만 제가 잊고 있었던 부분이었습니다. 프로젝트를 다시 생성할 ..