Spring

- 생성자 주입을 권장하는 이유

https://smirkdev.tistory.com/46

 

의존성 주입(DI) 시에 생성자 주입을 사용해야하는 이유

의존성 주입 방법들 - 생성자 주입 가장 많이 보게 되는 생성자 주입방식이다. 생성자를 통해 객체를 주입해주며 Spring 프레임워크 자체에서도 생성자주입을 권장하기 때문에 생성자가 하나만

smirkdev.tistory.com

 

 

- Filter와 OncePerRequestFilter의 차이

사용자의 요청을 받으면 서블릿이 생성되어 메모리에 저장되고, 같은 클라이언트의 요청을 받으면 이 서블릿 객체를 재활용한다.

근데 어떤 서블릿이 다른 서블릿으로 dispatch된다면 그 서블릿에 도착하기 전 다시 한번 FilterChain을 거치면서 원치 않게 필터를 두번 거치게 된다. 

OncePerRequestFilter는 사용자의 request에 딱 한번 실행되는 필터이고 doFilter가 아닌 doFilterInternal을 꼭 Override 해주어야 한다.

 

알고리즘

- 프로그래머스 : n^2 배열 자르기(Level 2, 구현)

 

느낀 점

 

'TIL' 카테고리의 다른 글

[23.12.19]  (1) 2023.12.19
[23.12.18]  (0) 2023.12.18
[23.12.14]  (0) 2023.12.15
[23.12.13]  (0) 2023.12.13
[23.12.12]  (0) 2023.12.12

Spring

- 오류 해결

Validation @Pattern(regexp) 관련 오류

 

위와 같이 최소 길이가 3이고 영어 대소문자 + 숫자로 이루어진 닉네임을 받고자 @Pattern을 이용해 유효성 검증을 넣어주었다.

그 후 nickname에 "dongha1234"라는 값을 넣어주니

이렇게 유효성 검증에 실패했다는 메시지가 떴다.

 

해결방법은 정규식에 문자 길이 범위를 지정해주는 것이다.

여러가지 실험을 해보았는데 @Size 어노테이션은 min, max 모두 설정해도 정규식 관련 validation을 통과하지 못했다.

*를 사용할 것이 아니라면 길이 범위 지정이 필수적이다.

 

ResponseEnity와 Jackson 관련 에러

진행중인 프로젝트에서 RestControllerAdvice로 커스텀 예외들을 처리해주고 있는데

디버깅 결과 에러 던지는 곳까지는 잘 가지만 response를 제대로 보내주지 못하고 500이 뜨는 에러가 발생했다.

 

 

에러 로그는 잘 출력되지만 HttpMedia~ Exception이 발생하면서 전달이 안 된다.

 찾아보니 ResponseEntity의 body에 ErrorResponse가 담길 때 문제가 생긴 것이었다.

스프링이 선택한 Jackson이 ErrorResponse를 json 객체로 변환해서 ResponseEntity에 담아주어야 하는데.

Jackson에서 생성한 Objectmapper는 json으로의 변환을 getter 메소드를 통해 진행해준다. (setter는 안됨!!)

결론은 ErrorResponse 클래스에 @Getter 추가해주니 해결이 되었따.

알고리즘

- 프로그래머스 : 튜플(Level 2, 정렬)

느낀 점

 

'TIL' 카테고리의 다른 글

[23.12.18]  (0) 2023.12.18
[23.12.15]  (1) 2023.12.15
[23.12.13]  (0) 2023.12.13
[23.12.12]  (0) 2023.12.12
[23.12.11]  (0) 2023.12.12

Spring

- 정적 팩토리 메소드

생성자 대신에 public static  클래스 메소드를 통해 간접적으로 객체 생성을 유도하는 것을

정적 팩토리 메소드라고 부른다.

 

정적 팩토리 메소드의 장점

1. 생성 목적에 대한 이름 표현이 가능.  new Product() 이런 것 보다는

Product.productMadeOf, Product.productMadeFrom 등등 메소드의 이름을 통해 객체의 특성에 대해 묘사할 수 있다.

2. 인스턴스에 대해 관리가 가능하다.

메소드를 통해 간접적으로 객체를 생성하기 때문에 객체의 생성에 대한 통제가 가능하다.

객체를 싱글톤으로 쓰고 싶다면 private static 으로 필드에 객체를 하나 선언해 두고, getInstance()를 통해 새로 생성해주든(필드값이 null이라면)  저장된 객체를 받아오든 할 수 있다. (해시 맵으로도 인스턴스를 관리할 수 있다.

3. 인터페이스에 사용하면 하위 객체(구현체)를 받아올 수 있다.

4. 캡슐화, 정보 은닉

알고리즘

- 프로그래머스 : 메뉴 리뉴얼(Level 2, 완전탐색)

느낀 점

 

'TIL' 카테고리의 다른 글

[23.12.15]  (1) 2023.12.15
[23.12.14]  (0) 2023.12.15
[23.12.12]  (0) 2023.12.12
[23.12.11]  (0) 2023.12.12
[23.12.08]  (0) 2023.12.08

Spring

- JPA 연관관계를 끊고 진행한 프로젝트 회고

https://github.com/Four-Talking/Nateam

 

GitHub - Four-Talking/Nateam

Contribute to Four-Talking/Nateam development by creating an account on GitHub.

github.com

 

- Entity 클래스에 @NoArgsConstructor(access=AccessLevel.PROTECTED)를 사용하는 이유

일단 protected는 같은 패키지나 자식 클래스에서 사용할 수 있는 접근 제어자이다.

 

Entity가 지연 로딩에서 조회를 할 때 실제 엔티티가 아닌 프록시 객체를 조회한다.

JPA는 기본 생성자를 통해 프록시 객체를 생성하는데 private면 객체 생성이 불가한 것이다.

 

그러나 em.find거나 즉시 로딩처럼 실제 Entity를 가져오는 경우에는 private 여도 상관은 없다.

Post에 지연로딩을 설정해놓았다 가정하고(지연 로딩이기 때문에 post의 accesslevel은 무관), User에 private을 설정하면 post.getUser(); 을 했을 때 NoSuchMethodException이 터진다.

알고리즘

- 프로그래머스 : 디펜스 게임(Level 2, 우선순위 큐)

계속 정렬해가면서 최대, 최소의 수(혹은 몇개의 수)를 추적해야할 때는 우선순위큐를 먼저 떠올리자.

원소를 넣어줄때마다 벡터로 정렬했더니 시간초과가 났다.

느낀 점

 

 

'TIL' 카테고리의 다른 글

[23.12.14]  (0) 2023.12.15
[23.12.13]  (0) 2023.12.13
[23.12.11]  (0) 2023.12.12
[23.12.08]  (0) 2023.12.08
[23.12.06]  (0) 2023.12.06

Spring

DI(의존성 주입은)는 무엇일까?

알고리즘

- 프로그래머스 : 시소 짝꿍(Level 2, 구현)

 

느낀 점

'TIL' 카테고리의 다른 글

[23.12.13]  (0) 2023.12.13
[23.12.12]  (0) 2023.12.12
[23.12.08]  (0) 2023.12.08
[23.12.06]  (0) 2023.12.06
[23.12.05]  (1) 2023.12.06

Spring

이모저모

equals 메소드 사용할 때 앞에 확실한 변수나 자료형을 넣어주는 이유

-> a.eqauls(b) 할때 a가 null이라면 NPE가 뜬다.

 

변수명 바꿀 떄는 shift + f6으로 한번에 바꾸자(intellij)

 

boolean 자료형을 반환하는 메소드 이름은 예-아니오로 대답할 수 있는 문장으로 지어라.

 

소셜 로그인 유저와 회원가입한 유저를 어떻게 구분지을 것인가.

한 테이블에 가입한 네트워킹 서비스 정보를 저장하고, 각각 필요한 필드값이 다를 때는 nullable이나 기본값을 줘서 관리한다

vs

가입을 지원하는 네트워크 서비스마다 테이블을 따로 두어 관리한다.

 

전자의 장점은 일단 구현이 단순해져 작업시간 측면의 리소스 이득을 본다.

단점은 결합도가 매우 높아진다.

 

후자의 장점은 각 테이블에서 변동사항이 있을 때 서로 영향을 주지 않는다.(해당하는 테이블에 column만 추가하면 됨)

단점은 구현 난이도가 올라간다. 테이블이 생길수록 어떤 테이블을 참조해야하는 지 다 체크해줘야하고 어디까지 나눌지 어디까지 결합할 지 생각해주는 게 매우 어려웠다.

 

현업에서는 두 케이스 모두 사용한다고 해서 선택의 문제인 것 같다. 실력을 올리 데에는 후자가 더 좋겠지만..

 

 

알고리즘

- 프로그래머스 : 테이블 해시 함수(Level 2, 정렬)

  내가 문제를 푼 IDE(visual studio)와 프로그래머스 상의 IDE 의 코드가 똑같음에도 불구하고 결과값이 다른 오류가 발생했다. 

-> 내가 vector 조회 인덱스를 잘못 넣어서 size가 2인 벡터에서 index 2에 접근했다. 

-> VS는 v[2] 값을 0을 반환해줬고 프로그래머스는 10을 반환해줬다.(쓰레기값)

하필 4랑 14 이렇게 10차이 나서 고민하느라 고생했다.

느낀 점

'TIL' 카테고리의 다른 글

[23.12.12]  (0) 2023.12.12
[23.12.11]  (0) 2023.12.12
[23.12.06]  (0) 2023.12.06
[23.12.05]  (1) 2023.12.06
[23.12.01]  (0) 2023.12.04

Spring

- DTO 객체에 inner class 적용

public class SignupDTO {

    public record Request(
            @Pattern(regexp = "^[a-z0-9]{4,10}$") String userName,
            @Pattern(regexp = "^[A-Za-z0-9]{8,15}$") String password)
    {
    }

    @Builder
    public record Response(String message) {

    }
}

DTO에 inner class를 도입해서 어떤 요청에 대한 응답 형태를 한번에 볼 수 있어 로직에 대한 이해가 쉬워질 수 있다.

여기에 정적 팩토리 메소드까지 도입하면 더 짱일듯 

 

Git

오늘 Intellij에서 작업 중 local feature branch를 따서 개발을 진행하다가 local main으로 checkout 할 일이 생겼다.  근데 건드리지도 않은 main branch에 내가 feature branch에서 작업한 untracked file들이 생겨있는 것 아닌가!!!!!

너무 당황한 채로 검색해보다가 결국 튜터님을 찾아갔는데 10초만에 대답해주셨다.

 

로컬에서 새로운 파일들은 브랜치를 옮기면 자동으로 따라간다. 파일들을 작업중인 브랜치에만 두고 싶으면 커밋에 올려두면 커밋에 올라간다.


그리고 원래 브랜치를 옮기려면 커밋을 하라고 경고를 하고. smart checkout, force checkout 이렇게 물어보는데 나같은 경우는 그냥 checkout이 되었다.

이렇게 가능한 이유는 로컬 기준으로 내 현재 브랜치가 옮기려는 브랜치보다 앞서있기 때문에 묻지 않고 가능한 것이라고 한다.

알고리즘

- 프로그래머스 : 호텔 대실(Level 2, 정렬)

느낀 점

'TIL' 카테고리의 다른 글

[23.12.11]  (0) 2023.12.12
[23.12.08]  (0) 2023.12.08
[23.12.05]  (1) 2023.12.06
[23.12.01]  (0) 2023.12.04
[23.11.30]  (1) 2023.12.01

Spring

동일성과 동등성 알아보기

 

[JAVA] 동일성(identity)와 동등성(equality) (feat. ==, equals, hashcode())

동일성(identity) 객체의 동일성이란 두 객체가 주소값까지 동일해 객체의 정보들까지 동일할 수 밖에 없는 완전히 같은 객체임을 의미한다. 동등성(equality) 객체의 동등성은 두 객체가 가지고 있

smirkdev.tistory.com

알고리즘

- 프로그래머스 : 최솟값 만들기(Level 2, 정렬)

느낀 점

오늘은 하루종일 프로젝트 설계만 했는데도 궁금증을 하나하나 가지다 보니 잘하는 팀원분이 이런 게 있다... 라고 말씀해주셔서 감사했다.

더 나아가 공부할 게 참 많다는 생각이 들었다...

'TIL' 카테고리의 다른 글

[23.12.08]  (0) 2023.12.08
[23.12.06]  (0) 2023.12.06
[23.12.01]  (0) 2023.12.04
[23.11.30]  (1) 2023.12.01
[23.11.29]  (0) 2023.11.29

+ Recent posts