[Java] 메서드 추출(Extract Method)로 복잡한 비즈니스 로직 개선하기
·
Spring/Spring에서 Java 활용하기
안녕하세요. 자바 스프링 백엔드 개발자 stark입니다!실무에서 개발한 코드를 보면 비즈니스 로직이 엄청 긴 경우가 있습니다. 이 경우 내가 이렇게 열심히 작성했구나! 이런 뿌듯함을 느낄 수는 있지만 '근데 이거 뭘 작성한 거지?' 이런 생각이 들기도 합니다. 만약 작성한 코드 중간에 비즈니스가 추가되어 수정해야 하거나 개발 중에 잠깐 쉬다 와서 흐름을 잃었다면 '대체 내가 위에 어떤 비즈니스 코드를 작성했지?' 이런 생각이 들면서 모든 코드를 한 줄씩 다 천천히 읽어가며 이해해야 하는 상황이 발생합니다. 심지어 실무에선 내가 작성한 코드가 아닌데 수정해야 하는 경우도 정말 많기에 코드를 작성할 때부터 이해하기 쉽게 작성할 필요성이 있습니다. 그럼 어떻게 해야 우리가 작성한 코드가 읽기 쉬워질까요? 여러..
[Spring] JPA 엔티티에 왜 기본 생성자가 필수일까?
·
Spring/JPA
안녕하세요. 글 쓰는 개발자 stark입니다! 오늘은 JPA를 사용하면서 "왜 엔티티에 기본 생성자가 필수적일까? 하는 궁금증을 해결하기 위해 공부한 내용을 정리해보려고 합니다. 어느 날, 제가 작성한 코드를 리뷰하며 피드백하던 중 엔티티 클래스가 너무 지저분하게 작성된 것이 아닌지 생각해 보게 되었습니다. 그래서 어떻게 해야 코드가 깔끔해질지 고민하며 매개변수가 없는 기본 생성자를 제거해 보았습니다.@AllArgsConstructor(access = AccessLevel.PRIVATE)@NoArgsConstructor // 이 코드를 제거했습니다.@Getter@Entity@Table(name = "member")public class MemberEntity { @Id @Genera..
[Spring] ApplicationRunner 활용하기
·
Spring/Spring 기초 지식
스프링의 ApplicationRunner를 활용해 보자.📌 서론스프링 부트(Spring Boot) 애플리케이션에서 ApplicationRunner를 사용하면 애플리케이션이 시작될 때 특정 로직을 실행할 수 있다. 특히 @Configuration 클래스 내에서 @Bean으로 등록하면 필요한 빈들을 주입받아 유연하게 사용할 수 있다. 이번 포스팅에서는 실무에서 바로 적용할 수 있는 몇 가지 예제와 함께 ApplicationRunner의 활용 방법을 자세히 알아보도록 하자. 1. ApplicationRunner란 무엇인가?ApplicationRunner는 스프링 부트 애플리케이션(서버)이 완전히 초기화된 후 실행되는 콜백 인터페이스다. 이를 구현하면 애플리케이션 시작 시점에 필요한 작업을 수행할 수 있다. ..
[Spring] 스프링 시큐리티 설정이 @Bean 기반 구성으로 바뀐 이유
·
Spring/Spring Security
Spring Security에서 WebSecurityConfigurerAdapter를 @Bean 기반 구성으로 변경한 이유📌 서론Spring Security는 스프링 서버를 구성하면서 보안을 적용하는 데 많이 사용된다. 특히, 요즘처럼 클라이언트 측 렌더링(Client-Side Rendering, CSR)을 많이 사용하는 환경에서 JWT(JSON Web Token)를 사용하여 인증 및 인가를 구현하는 애플리케이션에서 Spring Security는 매우 중요한 역할을 한다. Spring Security 5.7부터는 시큐리티의 클래스 구성 방식이 기존과는 상당히 달라졌다. 이 글에서는 그 변화를 간단히 설명하고, 새로운 보안 구성 클래스의 작성 방법을 간단히 알아보도록 하자. 1. WebSecurityCo..
[Spring] 단위테스트 @InjectMocks 사용방법
·
Spring/테스트 코드
단위테스트에서 @InjectMocks, @Mock, @Spy에 대한 것을 알아봤다.📌 서론요즘 개발하면서 단위 테스트를 많이 작성하는데 갑작스레 궁금증이 생겼다.단위 테스트에서는 주로 @SpringBootTest가 아니라 @InjectMocks를 사용하는데 이 애노테이션의 이름만 보면 "Inject + Mocks = 목 객체들을 주입한다." 이렇게 해석되는데 이것도 객체에 Mock을 주입하는 거니까 스프링의 의존성 주입과는 뭐가 다를지 알아보고 싶었다. 이렇게 시작된 궁금증으로 직접 단위 테스트를 작성해 보면서 주로 보게 되는 @InjectMocks, @Mock, @Spy 이것들의 관계성을 알아봤다. 또한 테스트 과정에서 인터페이스는 @Mock을 사용해야 했는데 왜 @Spy는 사용할 수 없는지 이것에 ..
[Spring] 스프링 순환참조
·
Spring/Spring 기초 지식
스프링의 순환참조 상황을 알아보자📌 서론스프링으로 개발을 하다 보면 정말 가끔씩 발생하는 오류가 있다. 바로 circular references (순환참조)다.스프링 빈을 등록하면서 2가지의 클래스가 서로를 의존하면 이러한 문제가 발생한다. 서버가 실행되면 스프링 컨테이너가 빈을 등록하는 과정에서 의존성 주입을 하는데 이 과정에서 서로 의존하는 두 빈이 서로를 기다리며 무한루프에 빠지게 되는 것이다.순환참조라는 이름만 봐도 순환해서 참조한다는 의미이므로 생각해 보면 간단하게 한쪽의 참조만 끊어주면 해결될 것으로 보인다. 그러나 가끔은 서로의 로직을 사용해야 하는 경우가 있을 수도 있다. 이때는 어떻게 문제를 해결해야 할까?  이런 상황에 문제를 해결하는 여러 가지 방법이 존재한다. 1. @Lazy 어노..
[Spring] synchronized를 사용한 동시성 문제 해결방법
·
Spring/Spring에서 Java 활용하기
개발중 동시성 문제를 해결하기 위해 lock을 걸곤 한다. 이때 synchronized를 잘못된 위치에 사용하면 lock이 제대로 걸리지 않으니 주의하자.📌 서론자바와 스프링으로 서버를 개발하다 보면 synchronized를 사용해서 lock을 걸어본 경험이 있을 것이다.또한 스프링 내부를 뜯어보다 보면 종종 synchronized를 사용한 코드들이 보인다. 나는 이것들에 대해 크게 신경 쓰지 않고 있었는데 이번에 인강으로 동시성 문제에 대한 공부를 하던 도중 새롭게 알게 된 사실이 있다. 바로 synchronized는 트랜잭션이 걸린 서비스 코드가 아닌 이 서비스 코드를 호출하는 컨트롤러에 걸어줘야만 동기화가 제대로 동작한다는 것이다.지금부터 코드를 통해 왜 서비스에서 synchronized를 적용시..
[Spring] 코틀린 스프링에서 Validation 적용 방법과 주의점
·
Spring/Spring 기초 지식
코틀린 스프링에서 Spring Validation을 적용하기 위해서는 꼭 알아둬야 할 것이 있다.📌 서론코틀린 스프링으로 개발하던 도중 독특한 문제를 만났다.프로젝트에 spring validation을 적용시켜 requestDto의 유효성을 검증하도록 설계했다. 왜냐하면 코틀린이 null safe 한 언어라지만 클라이언트 측에서 보내는 데이터까지 모두 컨트롤할 수 없기 때문에 클라이언트 요청을 바로 validation으로 검증하여 데이터의 무결성을 보장하고자 했다.  그래서 나는 검증하고자 하는 DTO 필드에 @NotBlank 어노테이션을 적어줬고 HTTPie(Postman)을 사용해 validation을 적용한 필드에 값을 넣지 않고 api요청을 보내봤다. (일부로 오류를 발생시키기 위함) 근데.....