BackEnd263 [RestAssured] Multiparts 테스트 작성시 Json데이터와 File을 함께 보내기 (Cannot serialize because cannot determine how to serialize content-type multipart/form-data) 1. 문제의 상황 이번 문제는 기존의 Json만 전달하면 RestAssured 테스트 코드에서 multiparts를 전달하다 보니 발생한 문제였다. 우선 다음과 같이 (Json데이터 + multipart form data)를 함께 보내려 한다. 이를 받는 컨트롤러는 다음과 같다. @PostMapping("/api/sessions") public ResponseEntity createNewSession( @RequestPart @Valid SessionRequest request, @RequestPart List files) { SessionDto session = toDto(request); long currentGenerationId = generationService.getActiveGeneratio.. BackEnd/TDD 2023. 2. 28. [JPA] Unable to find column with logical name: child_name in org.hibernate.mapping.Table and its related supertables and secondary tables 1. 문제의 상황 RoleHierarchy라는 Entity에서 필드로 String childName을 가지고 있다. 또한 내가 알기로는 Spring이 알아서 저장할 때 camel case로 변환하여 저장해 주는 것으로 알고 있다. 하지만 다음과 같이 childName이라는 column을 찾을 수 없다는 오류에 직면하게 되었다. 이러한 문제가 발생한 이유는 바로 부모를 참조할 때 referencedColumnName으로 "child_name"을 지정해 줬기 때문이다. 원래는 referencedColumnName을 지정하지 않고, default로 설정하는 부모의 id값을 기본으로 사용하겠지만, 나의 코드에서는 Role의 이름이면 충분히 구별할 수 있었기 때문에 id를 저장할 필요가 없었다. (id가 1인 R.. BackEnd/JPA 2023. 2. 16. [Spring Security] SecurityConfig와 UserDetailsService에서 순환참조 문제 (Error creating bean with name 'securityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference?) 1. 문제의 상황 우선 Custom한 AuthenticationProvider를 구현하던 도중, 구현의 편의를 위해 @Autowired로 필요한 의존성들을 끌어다 사용 중 이었다. 또한 정상적으로 실행되고 있었다. 기능이 구현된 후에 단지 의존성 주입방식을 생성자 주입 방식으로 변경 테스트를 수행했는데 다음과 같은 에러가 발생하였다! SecurityConfig memberDetailsService(UserDetailsService) 간에 순환 참조 문제가 발생하게 된 것 이다! 우선 문제가 되고 있는 코드를 살펴보자! ▶ LoginAuthenticationProvider @RequiredArgsConstructor public class LoginAuthenticationProvider implement.. BackEnd/Spring Security 2023. 2. 8. [Refactoring] 데이터 클래스 (Data Class), 유산 포기 (Refused Bequest), 주석 (Comments), 중첩 조건문을 보호 구문으로 바꾸기 (Replace Nested Conditional with Guard Clauses) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 18. 데이터 클래스 ▶ 데이터 클래스 : public 필드 또는 필드에 대한 게터와 세터만 있는 클래스 - 코드가 적절한 위치에 있지 않기 때문에 이러한 냄새가 생길 수 있다. - 예외적으로“단계 쪼개기”에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있다. public 필드를 가지고 있다면 “레코드 캡슐화하기 (Encapsulate Record)”를 사용해 getter/setter를 통해서 접근하 도록 고칠 수 있다. (여기서 말하는 "레코드"는, public 필드로 구성된 데이터 클래스를 말한다) 변경되지 않아야 할 필드에는“세터 제거하기 (Remove Setting Method)”를 적용할 수 있.. BackEnd/Refactoring 2023. 1. 8. [Refactoring] 중재자 (Middle Man), 내부자 거래(Insider Trading), 거대한 클래스 (Large Class) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 15. 중재자 캡슐화는 내부의 구체적인 정보를 최대한 감출 수 있기 때문에 자주 사용된다. 그러나, 어떤 클래스의 메소드가 대부분 다른 클래스로 메소드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있다. 15 - 1) 중재자 제거하기 필요한 캡슐화의 정도는 상황에 따라서 달라질수가 있다. 흔히 말하는 Law of Demeter를 지나치게 따르기 보다는상황에 맞게 활용하도록 하자! 예를 들어 원래는 Person에 getManager()를 통해 한번에 manager를 얻어올 수 있었다. public class Person { private Department department; private .. BackEnd/Refactoring 2023. 1. 8. [Refactoring] 성의없는 요소 (Lazy Element), 추측성 일반화 (Speculative Generality), 임시 필드 (Temporary Field) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 12. 성의없는 요소 프로그래밍을 하면서 여러 변수, 메서드, 클래스를 만들게 된다. 만들 당시에는 의미를 명확하게 하기 위해서, 또는 중복을 제거하기 위해서 사용했겠지만... 그렇게 예상하고 만들어 놓은 요소들이 기대에 부응하지 못하는 경우가 있는데 그런 경우에 해당 요소들을 제거해야 한다! 함수 인라인, 클래스 인라인, 계층 합치기 를 통하여 리팩토링 할 수 있다. 13. 추측성 일반화 나중에 이러 저러한 기능이 생길 것으로 예상하여, 여러 경우에 필요로 할만한 기능을 만들어 놨지만 “그런 일은 없었고...”결국에 쓰이지 않는 코드가 발생한 경우. XP의 YAGNI (You aren’t gonna need it) 원칙을 따르자. => 지금 당장 .. BackEnd/Refactoring 2023. 1. 7. [Refactoring] 데이터 뭉치 (Data Clumps), 기본형 집착 (Primitive Obsession) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 10. 데이터 뭉치 ▶ 항상 뭉쳐 다이는 데이터는 한 곳으로 모아두는 것이 좋다. 1) 여러 클래스에 존재하는 비슷한 필드 목록 2) 여러 함수에 전달하는 매개변수 목록 관련 리팩토링 기술 관련된 리팩토링 기술로는, “클래스 추출하기 (Extract Class)”를 사용해 여러 필드를 하나의 객체나 클래스로 모을 수 있다. “매개변수 객체 만들기 (Introduce Parameter Object)” 또는 “객체 통째로 넘기기 (Preserve Whole Object)”를 사용해 메소드 매개변수를 개선할 수 있다. 11. 기본형 집착 보통 애플리케이션을 개발할 때 도메인에 필요한 기본 타입을 만들기보다는 프로그래밍 언어가 제공하는 기본타입을 사용하는 .. BackEnd/Refactoring 2023. 1. 6. [Refactoring] 산탄총 수술 (Shotgun Surgery), 기능 편애 (Feature Envy) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 8. 산탄총 수술 왜 그냥 Gun도 아닛고 Shotgun일까? 샷건은 여러 파편이 퍼져 나간다는점을 상기하면 납득이 간다. 이전에 살펴본 뒤엉킨 변경의 경우 여러 이유로 하나의 Class를 계속해서 손봐야 하는 경우이다. 이번 산탄총 수술의 경우 새로운 방식을 도입하려면 여러 곳을 수정해야 한다. 8 - 1) 필드 옮기기 처음에는 타당해 보였던 설계적인 의사 결정도 프로그램이 다루고 있는 도메인과 데이터 구조에 대해 더 많이 익혀나가면서, 틀린 의사 결정으로 바뀌는 경우도 있다. 필드 또한 처음 만들때는 적절해 보였을 수 있지만, 어느순간 부터 다른 데이터와 항상 함께 전달된다거나, 어떤 레코드를 변경할때 다른 곳에 있는 필드를 변경해야 하는 경우 .. BackEnd/Refactoring 2023. 1. 6. [Refactoring] 뒤엉킨 변경 (Divergent Change) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 7. 뒤엉킨 변경 소프트웨어는 변경에 유연하게(soft) 대처할 수 있어야 한다. 어떤 한 모듈이 (함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 상황에서 이러한 모듈이 책임에 따라 잘 분리되어 있다면 변경에 대처하기가 쉽다. 예) 새로운 결제 방식을 도입하거나, DB를 변경할 때 동일한 클래스에 여러 메소드를 수정해야 하는 경우. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며 다른 문제는 신경쓰지 않아도 된다. 7 - 1) 단계 쪼개기 다음과 같이 priceOrder라는 매우 다양한 역할을 하고 있는 메서드가 있다. public class PriceOrde.. BackEnd/Refactoring 2023. 1. 4. [Refactoring] 가변 데이터 (Mutable Data) 백기선 님의 리팩터링 강의를 들으며 요약한 내용입니다. 6. 가변 데이터 함수형 프로그래밍에서는 데이터를 변경할 때 복사본을 전달한다. 하지만 Java와 같은 언어에서는 데이터의 변경을 허용한다. Call By Value를 생각해보면 주소값을 전달하기에 변경여파가 크다. 따라서 데이터가 변경될 시 발생할 수 있는 여파를 관리할 방법을 적용해야 한다. 6 - 1) 변수 쪼개기 어떤 변수에 할당이 여러번 되고 있다 생각해 보자. 과연 적합한 상황일까? 다음 Rectangle 코드를 살펴보자! ▶ Rectangle public class Rectangle { private double perimeter; private double area; public void updateGeometry(double heig.. BackEnd/Refactoring 2023. 1. 3. [Spring] Spring Security에서 @WithMockUser를 커스텀하기 이번 글을 직전 글에서 발생한 문제를 해결하기 위해 @WithMockUser를 커스텀하여 사용하는 글을 작성해볼려 한다. 직전글을 꼭 읽을 필요는 없다. @WithMockUser를 커스텀하여 사용하는 방법은 이번 글만 보면된다. (다만 문제가 발생한 상황 이 궁금하다면 직전 글 도 살펴보길!) https://blogshine.tistory.com/626 [Spring] SpringSecurity에서 @AuthenticationPrincipal 대신 DTO로 받기 1. 문제의 상황 현 술술 애플리케이션에서는 로그인 한 사용자가 Controller에 접근할 때 CustomUser 객체를 인자로 전달받는다. 문제는 CustomUser가 도메인의 순수한 핵심 Entity라는 점이다... 또한 SonarQu bl.. BackEnd/Spring 2023. 1. 2. [Spring] SpringSecurity에서 @AuthenticationPrincipal 대신 DTO로 받기 1. 문제의 상황 현 술술 애플리케이션에서는 로그인 한 사용자가 Controller에 접근할 때 CustomUser 객체를 인자로 전달받는다. 문제는 CustomUser가 도메인의 순수한 핵심 Entity라는 점이다... 또한 SonarQube에서도 다음과 같이 취약지점으로 알려주고 있다. 과연 CustomUser의 모든 정보가 필요한 것일까? 아니다, 사실상 코드를 따라가며 읽어보니, id, email 2개의 값만 필요함을 알게 되었다. 따라서 이를 id, email만을 포함하는 DTO로 전달받도록 개선해 보자! 참고로, @CurrentUser는 내부에 @AuthenticationPrincipal을 갖고 있어서 Spring의 도움을 받아 마치 상속하는것 처럼 사용중이다. 이글의 목적은 @Authenti.. BackEnd/Spring 2023. 1. 2. 이전 1 2 3 4 5 6 ··· 22 다음