Programming 95

람다와 스트림만 사용하자(feat. CleanCode) 2024-01-30

세뇌하자. 나는 람다와 스트림만 사용하는 프로그래머다.. ㅎ🤣🤣 . 람다식(Lambda Expression)🤡 문법 문법은 간단합니다. 코드를 보는게 이해가 더 빠를 것이라고 생각됩니다. public int sum(int a, int b) { return a + b; } //람다식 변환 (a, b) -> a + b; 장점 매우 깔끔하고 알아보기도 쉽다. 동작을 사용하기 위해서 클래스를 정의할 필요도 없다. 메소드의 리턴 타입도 없고, 메서드의 이름도 없다. 람다와 함께 사용할 수 있다. 매소드 이름없이 작성할 수 있기 때문에 익명 함수(Anonymous Function)라고도 불립니다. 메서드의 이름도 리턴 타입도 없지만 뭐하는 식인지는 쉽게 알 수 있다는 장점 덕분에 java8부터 추가된 것이라고 생각..

Programming/JAVA 2024.01.30

클린코드 책 리뷰및 요약(2024-01-27)

이 책을 읽기전, 혹은 클린코드에 대한 개념을 알게되기 전에 내가썼던 코드는 쓰레기 같았다. 개발은 나혼자하는 것이 아니다. 남과 같이 하는 것이다. 아래는 내가 책을 읽으며 앞으로 코딩을 하며 지켜야 할 것들을 정리해 보았다. 1. 클린코드 핵심 요약 및 정리 [ 1. 객체의 생성에도 유의미한 이름을 사용하라 ] 객체의 생성자가 오버로딩 되는 경우 어떠한 값으로 어떻게 생성되는지 정보가 부족할 수 있다. 그러므로 이러한 경우에는 정적 팩토리 메소드를 사용하는 것이 보다 명확한 코드를 작성하게 해 줄 것이다. 하지만 구현을 드러내는 이름은 피하는 것이 좋다. (p32 참고) // 두 번째 인자가 무엇인지 파악이 어렵다. Product product = new Product("사과", 10000); // ..

Programming/JAVA 2024.01.27

JPA의 영속성 컨텍스트와 플러시 이해하기(2024-01-26)

영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자. 엔티티 매니저 팩토리와 엔티티 매니저 JPA는 스레드가 하나 생성될 때 마다(매 요청마다) EntityManagerFactory에서 EntityManager를 생성한다. EntityManager는 내부적으로 DB 커넥션 풀을 사용해서 DB에 붙는다. 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하는데 가장 중요한 용어이다. "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity); 앞의 예제에서 persist()로 db에 객체를 저장하는 것이라고..

@Value 스프링 빈 사이클에 따른 적용불가 오류 해결

이전포스트의 문제해결을 다른 관점으로 해결해 보았다. 해당 부분을 yml을 이용해서 @Value 애너테이션 을 이용하여서 숨길려고 시도해 보았지만 spotifyAPI.clientCredentials().build() 부분에서 로그상에 정상적으로 토큰이 존재하는데도 불구하고 옳지 않은 키 값으로 나왔다. 아무래도 스프링이로 등록될때 절차상에 제가 놓친부분이 있는거 같았다 ! @Slf4j @Component public class SpotifyConfig { private static String CLIENT\_ID; private static String CLIENT\_SECRET; @Value("${spotify.registration.client-id}") public void setClientId(S..

@Value 애너테이션 static 필드에 적용하기.

application.yml에 적어놓았던, 클라이언트 키를 이용해서 접근할려고 하니, 계속 유효하지 않다는 애러가 반복되었다. spring: datasource: url: ${DB_URL} driver-class-name: ${DB_DRIVER} username: ${DB_USER} password: ${DB_PASSWORD} hikari: maximum-pool-size: 20 jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect show_sql: true format_sql: true database: mysql show-sql: true hibernate: ddl-auto: update defer-datasource-ini..

스프링 시큐리티 필터 동작 과정(2024-01-22)

자료 스프링 시큐리티 필터 참고 자료(공식문서) Architecture :: Spring Security 로그인 모식도 스프링 시큐리티 필터 동작 원리 스프링 시큐리티는 클라이언트의 요청이 여러개의 필터를 거쳐 DispatcherServlet(Controller)으로 향하는 중간 필터에서 요청을 가로챈 후 검증(인증/인가)을 진행한다. 클라이언트 요청 → 서블릿 필터 → 서블릿 (컨트롤러) Delegating Filter Proxy 서블릿 컨테이너 (톰캣)에 존재하는 필터 체인에 DelegatingFilter를 등록한 뒤 모든 요청을 가로챈다. 서블릿 필터 체인의 DelegatingFilter → Security 필터 체인 (내부 처리 후) → 서블릿 필터 체인의 DelegatingFilter 가로챈 요..

JWT 와 Session 적용기 (2024-01-22)

I. 서론 JWT와 Session 비교 및 JWT의 장점 소개 II. 본론 Access Token과 Refresh Token의 도입 이유 Refresh Token 은 어떻게 Access Token의 재발급을 도와주는 걸까? Refresh Token Rotation Redis 저장 방식 변경 III. 결론 정리 생각해 볼 수 있는 문제 해결하고자 한 문제 JWT로 인증을 구현한 개발자라면 아래의 문제를 생각해 볼 수 있다. 1. 유효기간이 긴 Refresh Token이 탈취된 경우. -> 이 경우는 간단히 refresh token rotation 을 떠올릴 수 있다. 하지만 아래의 문제까지 커버할 수 있을진 의문이다. 2. 탈취한 Refresh Token으로 정상 유저보다 먼저 Access Token을 재..

@NotNull 비활성화 이슈 (2024-01-15)

문제 해결 PR https://github.com/Playlist-pack/Server/pull/64 ✔️ [Fix] : requestDTO의 @Notnull 기능 정상동작하도록 수정 by ulsandonghun · Pull Request #64 · Playlist-pack/ 기존에 동작하지 않았던 javax.validation.constraints의 @NotNull 어노테이션 기능을 새로운 의존성을 추가하여 동작하게 하였습니다. 해당 DTO에 @NotNull이 붙은 필드에 JSON value가 Null이면, 자바라이브러리 github.com 우선적으로 Request의 DTO에 붙은 @NotNull(쉽게 설명하면 반드시 Null이 아니어야 하는 곳에 Null이 입력되어서 전송되었을 경우, RuntimeE..

모킹 테스트 코드 작성 이슈 (2024-01-15)

플리보따리 에서 자동 로그인 부분을 테스트 코드 작성하던중 의문이 발생했다. 모킹이란 무엇일까 ? 결론부터 말하겠다. "A를 할건데, 이런 상황에선 B, C, D가 실행되어야해" 를 상정해두고 그게 잘 실행 되는지를 검증하는 것 이 문장이다. 즉 코드를 설명 하자면 package com.hositamtam.plypockets.user.controller; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.sprin..

처음으로 코드를 구조적으로 짠 순간

"첫 번째 TDD 도전기" 지금까지 나는 단위 테스트를 코드의 정상 작동을 "확인"하는 수단으로만 활용했다. 그러나 이번 우테코미션에서는 TDD 방법론을 이용하여 구현하는 것이 핵심 요구사항이었다. TDD를 이전에 경험한 적이 없었기에, 관련 자료를 찾아보았다. TDD의 핵심은 세 가지 철칙이었다. 이 세 가지 규칙은 반드시 지켜야 했다. 1. 테스트 코드를 먼저 작성하여 컴파일은 통과하고 실행은 실패하도록 만들기 2. 실패한 테스트 코드가 성공하도록 실제 코드를 작성하기 3. 실패한 테스트 코드가 통과할 수 있을 정도로만 코드를 작성하기 이 세 가지 사이클을 모든 기능 구현에 반복적으로 적용해야 했다. 처음에는 이 과정이 막막했다. 그러나 테스트 코드를 먼저 작성하고, 인텔리제이의 alt+enter 기..

Programming 2023.11.01