목록Backend (18)
Arthur's Blog

아래 글에서 "실제 서비스"는 개발자가 직접 작성한 서비스의 코드이고, "Proxy객체"는 Spring이 CGLIB 또는 JDK Proxy를 통해 실제 서비스를 감싼 객체이다. Service를 작성하게 되면 실행될 때 Proxy객체가 만들어지며 DI받은 Bean의 method를 실행시키면 Proxy객체를 통해서 실제 Service가 호출된다. public class ProxyUserService { private final UserService userService; private final EntityManager em; public void doTransaction() { EntityTransaction tx = em.getTransaction() try { tx.begin(); userService..
Spotless는 코드의 포멧을 맞춰주는 툴이다. Gradle에 추가해서 build 시 체크할 수 있고, 포멧에 맞게 수정도 할 수 있다. 옵션은 약 30개 이상 있어서, 사용할거라면 아래 깃허브를 참고하면 좋다. 깃허브 : https://github.com/diffplug/spotless 예시 spotless { java { target("src/main/java/github/**/*.java", ...) // Import 정렬 순서 importOrder("lombok", "org", "com", "java", "javax", "io.github") // 사용하지 않는 Import 제거 removeUnusedImports() // Custom Rule도 생성할 수 있다. custom("noWildc..
📌 정의 IoC 컨테이너, 어플리케이션 콘텍스트, 스프링 컨테이너, 스프링, DI 컨테이너 등 여러 용어로 불리지만 이 글에서는 “IoC 컨테이너” 라는 용어를 사용하겠다. 또한 해당 글에서는 xml설정이 아닌 java설정 설명만 있음에 주의하자. ❓ IoC 컨테이너가 뭐야? 간단하게 Bean부터 알고 넘어가야한다. Bean은 스프링이 제어권을 가지고, 직접 만들고 관계를 부여하는 오프젝트를 뜻한다. 스프링 빈은 IoC 컨테이너가 생성, 관계설정, 사용 등을 제어해주는 IoC가 적용된 오브젝트를 가리키는 말이다. 바로 위에서 언급했듯이 IoC 컨테이너는 스프링 빈을 생성, 관계설정, 사용 등을 제어한다. ♻ IoC 컨테이너의 동작방식 먼저, @Configuration이 붙은 Class에 @Bean이 붙어..
🎊 시작하기 전에.. EntryDSM에서 Entry 6.0을 작업하면서, 중간에 생겼던 오류 중 pdf 미리보기에서 다른 사용자의 사진이 보여지는 현상이 있었는데 QA를 진행하면서 원인을 찾았다. 해당 코드를 짧게 보자면 @Component class PdfConverter { private final Map values = HashMap(); ... } 와 같은 구조였는데 Bean은 상태를 가지면 안된다. 위의 코드에서는 Bean이 싱글톤이므로 요청이 들어와도 이전의 인스턴스를 그대로 사용하는데 이 상황에서 values까지 그대로 있었으므로 덮어쓰기 되지 않는 부분은 이전 사람의 값이 남아있는 것이었다. 따라서 Spring Bean은 State less해야한다는 것을 깨닫고 이 글을 작성하게되었다. 📌..
🐛 문제 상황 List 안의 value를 검증해야하는 상황인데 검증을 못함. 🏴☠️ 원인 List 변수 위에 validation 어노테이션을 붙이면 그 List에 대한 것을 검증하기 때문이다. ♻ 해결법 Java 8부터 지원된 어노테이션을 타입에 사용할 수 있는점을 활용하면 된다. 예를 들어 List 자료형이라면 List와 같이 사용하면 된다.
🎊 시작하기 전에.. 초보 개발자인 저의 의견에 대해 정리한 글입니다. interface-구현체구조를 흔히 무지성, 즉 이유없이 사용하거나 관례라서 사용하는 사례을 많이 봐왔습니다. 저는 그것을 굳이 interface를 사용해야 하는가? 라는 생각이 들어 글을 적었습니다. ✨ 다형성 Service의 구현체를 interface로 추상화해서 사용하는 이유중 가장 큰 이유가 다형성일 것입니다. 다형성이란 간단하게 하나의 Type에 여러 객체를 대입할 수 있는 성질입니다. 하지만 일반적인 스프링에서 서비스의 다형성을 굳이 구현해야 하는 이유를 저는 찾지 못했습니다. 예를 들어, UserService를 구현할 때 기능으로 유저 정보 가져오기, 닉네임 변경 등이 있다고 가정합시다. 이 UserService의 구현체..
🐛 문제 상황 Jwt Filter가 인증 과정에서 두 번 호출이 된다. 🏴☠️ 원인 Filter가 두 번 등록되어서 두 번 호출이 된다. 두 번 등록된 이유는 builder.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class);와 같이 필터를 등록했지만, 필터 상단의 @Component 어노테이션으로 인해 Filter Chain의 맨 마지막에 한번 더 등록되므로. ♻ 해결법 @Component 어노테이션을 제거한다.
❓ 필요한 이유 Spring Boot 어플리케이션을 제작하다보면 환경변수 중 기본값이 필요한 경우가 있다. 😉 설정하는 법 Properties leeseojune.password=${LSJ_PASSWORD:1234} Yml leeseojune: password: ${LSJ_PASSWORD:1234} 위와 같이 환경변수를 가져오는 ${LSJ_PASSWORD}에서 :(콜론)을 붙여준 뒤, 그 뒷부분에 값을 추가하면 환경변수에 값이 없을 시 들어간다.