공부/Spring(6)
-
[Spring] 의존성 역전 원칙 (Dependency Inversion Principle, DIP)
상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야한다. 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야한다.
2023.04.15 -
[Spring] Dependency Injection & IoC 톺아보기(2) - 강한결합 & 약한결합
앞서 살펴본 의존성에 관련해서 알아야 할 개념이 있는데, 객체 간의 결합도다. 강한 결합과 약한결합으로 나뉘는데, 먼저 강한결합에 대해 알아보겠다. 1. 강한 결합 하나의 객체가 다른 객체에 대해 직접적으로 의존하고 있는 상태를 의미한다. 이 경우, 하나의 객체를 수정하거나, 다른 객체를 추가하려고해도, 직접적으로 의존하고 있기 때문에 변경과 추가가 쉽지 않다. 이 것을 회피해서 추가하거나 수정하다보면 코드의 복잡도가 올라가고 결과적으로 유지보수의 지옥을 펼치는 원인이 된다. 물론 강한 결합이 나쁜점만 있는것은 아니다. 코드의 구현이 간단하고 직관적이고 객체 간의 연결이 명확하게 보이므로 코드를 이해하기 쉽다. => 초소규모 프로젝트의 경우엔 경우에 따라 강한 결합을 사용하기도 한다. 예시를 들어 설명하..
2023.04.15 -
[Spring] Dependency Injection & IoC 톺아보기(1) - 의존성과 의존성 주입방식
스프링에서 제공하는 의존성 주입에 대해 톺아보자. 먼저 의존성이란 무엇인지 간단하게 설명하면 다음과 같다. A라는 객체가 B라는 객체를 의존할때, 의존 대상인 B가 변하면 A도 그 영향을 받는다. 햄버거를 예로 들면 다음과 같은 HamburgerRecipe이라는 클래스가 존재하고 해당 클래스는 Bun, Patty, Vegetable이라는 클래스를 의존한다. 이때, 의존대상인 Bun, Patty, Vegetable 클래스들이 변하면 HamburgerRecipe도 그 영향을 받는다. 만약 Patty 클래스에서 다음과 같은 변경이 발생했다면, 위와 같이 HamburgerRecipe 클래스도 그 영향을 받는것을 확인 할 수 있다. 실제로는 훨씬 복잡한 개발환경속에서 이러한 의존성 문제가 계속 발생하면 매우 귀찮..
2023.04.14 -
[Lombok] @Builder.default
@Builder Lombok에서 제공하는 이 어노테이션은 생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성 해준다. 빌더 클래스와 IDE의 자동 완성 기능을 같이 활용하면 생성자 작성 시 오기입 확률과 인자를 누락할 확률을 획기적으로 낮출 수 있다. doc을 보면 @Builder는 생성자, 메서드 또는 클래스 레벨에서 쓰일 수 있다고 설명되어 있다. 또한 클래스 레벨에서 쓰일 경우 기본적으로 전체 멤버를 생성자의 매개값으로 갖는 private 생성자를 만들어 준다. 이 생성자는 @XArgsConstructor(NoArgs, RequiredArgs) 또는 어떤 생성자도 클래스 내부에 선언하지 않았을 경우에만 생성된다. 반대로 위의 두 조건 중 하나를 했을 경..
2023.02.08 -
[Querydsl] fetchResult() 가 deprecated 된 이유
QueryDsl로 페이징 쿼리를 작성하는데 .fetchResults()가 deprecated 되었다고 표시되었길래 찾아보았다. deprecated 된 이유 전문 fetchResults requires a count query to be computed. In querydsl-sql, this is done by wrapping the query in a subquery, like so: SELECT COUNT(*) FROM (). Unfortunately, JPQL - the query language of JPA - does not allow queries to project from subqueries. As a result there isn't a universal way to express cou..
2023.02.02 -
@RequestBody에 왜 기본생성자는 필요하고 Setter는 필요 없을까?
Springboot로 토이 프로젝트를 진행중 Request DTO(requestBody로 오는)에 @NoArgsConstructor를 빠뜨려서 에러가 났다. (습관적으로 적어오던 어노테이션...) 그런데 @RequestBody로 넘어오는 객체에는 기본 생성자가 왜 필요한지, Setter는 왜 불필요한지 이유를 정확히 모르고 있었다. 이번 기회에 해당 내용들을 구체적으로 알아보자. @RequestBody에 왜 기본생성자가 필요하고, Setter는 불필요한지 알아보기 위해선 Spring 내부에서 어떻게 처리하는지 확인해보면 됩니다.@RequestBody 까지 처리하는 flow를 보고싶다면 여기를 확인하면 좋을 것 같다. 그리고 이동욱님의 글에는 Setter가 왜 필요없는지에 대해 적혀있어서 도움을 받아 적습..
2023.01.29