본문 바로가기

Spring18

PasswordEncoder: There is no PasswordEncoder mapped for the id "null" 오류 원인 분석 Spring Security를 사용하여 인증을 시도할 경우 로그인 실패와 함께 아래와 같은 오류가 발생한 적이 있을 것입니다. java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:289) ~[spring-security-crypto-6.1.3.jar:6.1.3] at org.springframework.security.crypto.password.Dele.. 2023. 10. 3.
@EnableWebMvc 는 조심해서 사용하자 💡 이번 포스팅에서는 스프링 부트에서 resourceHandler에 대해 겪었던 이슈에 대해서 정리해 보도록 하겠습니다. 상황은 이렇습니다. 스프링 부트 + 타임리프로 개발을 잘 하고 있다가, 톰캣 AJP 설정을 해야 해서 @Configuration과 @EnableWebMvc를 사용하여 설정을 한 후에 갑자기 정적 Web Resource들이 모두 404 Not Found 에러가 발생하기 시작했습니다. 아래는 문제의 코드입니다. @Configuration @EnableWebMvc @RequiredArgsConstructor public class SpringServletConfig implements WebMvcConfigurer { private final TomcatAjpProperties tomcat.. 2023. 5. 31.
@ControllerAdvice & @RestControllerAdvice 💡 이번 포스팅에서는 @ControllerAdvice & @RestControllerAdvice에 대해 정리해 보도록 하겠습니다. 이전에 @ControllerAdvice, @RestControllerAdvice에 대해 찾아봤던 적이 있는데, 지금 다시 보니 잘 못된 부분이 있어 다시 정리해보고자 합니다. 때는 입사한 지 얼마 안 된 신입 때였는데 @ControllerAdvice, @RestControllerAdvice를 찾을 때 공식 문서나 java docs 대신 블로그 자료를 찾았었습니다. @ControllerAdvice를 설명할 때 ExceptionHandler와 같이 설명하는 블로그들을 쉽게 찾아볼 수 있을 것입니다. 보면 공통적으로 전역 예외 처리를 위해 @ControllerAdvice를 사용한다.. 2023. 4. 23.
Actuator (액츄에이터) 💡이번 포스팅에서는 Spring Boot의 Actuator (액츄에이터)에 대해서 정리해 보도록 하겠습니다. 💡이번 포스팅의 핵심은 Spring Boot의 Actuator란 무엇인지, 사용하는 방법에 초점을 맞췄기 때문에 조금 더 자세한 내용은 추후 따로 정리해 보도록 하겠습니다. 위와 같은 이유로 이번 포스팅에서 정리할 내용은 다음과 같습니다. Actuator란? Actuator 사용하기 Actuator Endpoint Enabling Endpoints Exposing Endpoints Implementing Custom Endpoint Actuator (액츄에이터) 란? actuator를 간단하게 정의하면 Spring Boot 애플리케이션을 제어하고 모니터링하기 위한 도구라고 할 수 있습니다. act.. 2023. 4. 2.
Bean은 무상태(stateless)로 설계하자 💡이 포스팅은 Spring Bean의 무상태(stateless)에 대해 정리한 포스팅입니다. Spring Bean stateless에 대해 학습한 GitHub Repository입니다. GitHub - kiekk/test-spring-bean-stateless Contribute to kiekk/test-spring-bean-stateless development by creating an account on GitHub. github.com Spring Bean에 관해 찾아보면 무상태(stateless)로 설계해야 한다고 합니다. 무상태란 말 그대로 상태가 없는 것을 뜻하며 Bean이 특정 상태를 가지고 있지 않는 경우를 말합니다. 하지만 이 부분을 조금 더 설명해 보면 Bean이라서 무상태(state.. 2023. 3. 27.
스프링 부트 앱에 초기화 코드를 넣는 방법 3가지 💡이 포스팅은 토비 님의 유튜브 영상인 스프링 부트 앱에 초기화 코드를 넣는 방법 3가지을 시청하고 학습한 내용을 정리한 포스팅입니다. 토비 님의 영상을 시청하며 정리한 GitHub Repository입니다. GitHub - kiekk/study-spring-boot-inject-initializer-codeContribute to kiekk/study-spring-boot-inject-initializer-code development by creating an account on GitHub.github.com 바로 본론부터 들어가면 스프링 부트 앱에 초기화 코드를 넣는 방법은 아래와 같이 크게 3가지 방법이 있습니다.CommandLineRunnerApplicationRunner@EventListen.. 2023. 3. 19.
@Controller에서도 ResponseEntity를 사용하면 Rest가 된다?? 💡이번 포스팅은 스프링 커뮤니티에서 한 개발자분이 공유해 주신 내용을 토대로 학습하여 정리한 포스팅입니다. 학습한 내용을 정리한 GitHub Repository입니다. GitHub - kiekk/spring-response-entity-test Contribute to kiekk/spring-response-entity-test development by creating an account on GitHub. github.com 먼저 공유해주신 내용은 다음과 같습니다. 저는 이 내용을 보자마자 흠칫했습니다. 이때까지 무의식에 rest-api를 만들 때 @RestController를 사용하면서 동시에 ResponseEntity를 사용해 왔었기 때문입니다. 제가 ResponseEntity를 사용한 이유는 r.. 2023. 3. 11.
window HTTPie 설치 HTTPie는 파이썬에서 개발된 유틸리티로 window에서 HTTPie를 사용하기 위해서는 파이썬을 별도로 설치해야 합니다. 파이썬 설치 https://www.python.org/downloads/ Download Python The official home of the Python Programming Language www.python.org cmd로 python 설치가 잘 되었는지 확인합니다. 그리고 아래와 같이 시스템 환경 변수를 등록합니다. 이제 cmd로 HTTPie를 설치합니다. pip install -U httpie 마지막으로 HTTPie가 정상적으로 설치되었는지 확인해봅니다. 2023. 1. 31.
1-8. 스프링이란 무엇인가? 8장에서 비로소 스프링이란 무엇인가? 에 대해 설명합니다. 보통의 책들은 1장에서 바로 스프링의 개념에 대해 설명할 텐데, 오히려 토비 님은 책의 마지막에서야 비로소 스프링이 무엇인지 설명합니다. 이는 스프링이 무엇인지 말로 설명해 봤자 이해가 잘 되지 않을뿐더러, 직접 코드로 확인해 봐야 더 잘 이해가 될 것이라는 토비 님의 생각이 담겨 있었기 때문이고, 읽기 모임에서도 여러 번 언급하셨듯이 이를 통해서 토비 님은 스프링이 굉장히 특별한 기술이 아니라는 것을 말하고 싶었던 것 같습니다. 1권을 통해서 스프링 이전에 어떤 문제점들이 있었고, 스프링은 이를 어떻게 해결해 왔는가, 그리고 스프링은 앞으로 어떤 방향성을 가지고 발전해나 가는가에 대해 알 수 있어서 좋았습니다. 스프링의 특징 자바 엔터프라이즈 .. 2023. 1. 15.
1-7. 스프링 핵심 기술의 응용 현실적으로 SQL의 변경 작업은 생각보다 빈번히 일어납니다. 개발 중에는 물론이고 운영 중인 시스템의 SQL을 변경해 달라는 요청도 드물지 않습니다. 그렇다고, 그때마다 DAO 코드를 수정하고 이를 다시 컴파일해서 적용하는 건 번거로울 뿐만 아니라 위험하기도 합니다. (p.558) 이번장은 초난감 DAO에 아직 남아있는 SQL 문자열을 분리하는 과정을 통해 스프링의 여러 추상화된 기술을 설명하며 다시 한번 DI의 중요성에 대해 설명합니다. 1장부터 지금까지 계속해서 DI를 강조하는데, 실제 읽기 모임에서도 토비님은 DI가 정말 중요하다고 거듭 언급하실정도로 스프링을 학습하는 데 있어서 DI는 꼭 빠트릴 수 없는 것 같습니다. DI란 결국 미래를 프로그래밍 하는 것입니다. (p.618) 그리고 DI를 적용.. 2023. 1. 15.
1-6. AOP (2) 이전에 JDK 다이내믹 프락시를 사용해 반복되는 로직을 제거하며, 핵심 기능과 부가 기능을 분리해 보았습니다. 변하지 않는 타깃으로의 위임과 부가기능 적용 여부 판단이라는 부분은 코드 생성기법을 이용하는 다이내믹 프락시 기술에게 맡기고, 변하는 부가기능 코드는 별도로 만들어서 다이나믹 프록시 생성 팩토리에게 DI로 제공하는 방법을 사용했습니다. 그렇다면 반복적인 프락시 메서드 구현을 코드 자동생성 기법을 이용해 해결했다면 반복적인 ProxyFactoryBean 설정 문제는 설정 자동등록 기법으로 해결 할 수 업슬까? 또는 실제 빈 오브젝트가 되는 것은 ProxyFactoryBean을 통해 생성되는 프록시 그 자체이므로 프락시가 자동으로 빈으로 생성되게 할 수는 없을까? 스프링에서는 빈 후처리 기를 이용해.. 2023. 1. 10.
1-6. AOP (1) AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3개 기반기술의 하나입니다. AOP는 스프링의 기술 중에서 가장 이해하기 힘든 난해한 용어와 개념을 가진 기술로 악명이 높습니다. ... 필연적인 등장배경과 스프링이 그것을 도입한 이유, 그 적용을 통해 얻을 수 있는 장점이 무엇인지에 대한 충분한 이해가 필요합니다. 그래야지만 AOP의 가치를 이해하고 효과적으로 사용할 방법을 찾을 수 있습니다. (p.401) 이번 6장은 분량이 많아 1, 2로 나누어 포스팅하겠습니다. 6장은 기존의 어떤 문제로 인해 AOP가 등장하게 되었는지, 어떤 방식으로 AOP가 동작하는지 그리고 AOP에 관련된 용어들에 대해 학습합니다. 읽기 모임에서 토비 님께서 직접 AOP가 가장 재미있고 중요하다고 생각한다고 말씀하셨는데.. 2023. 1. 9.
1-5장. 서비스 추상화 5장은 서비스 추상화로 기존의 초난감 DAO에서 기능을 추가하고 리팩토링 과정을 거쳐 더 나은 구조를 설계하는 과정을 소개합니다. 5장에서는 초난감 DAO에서 사용자의 레벨 관리 기능을 가지고 기능 추가 및 리팩토링 과정을 학습합니다. public class User { private String id; private String name; private String password; private static final int BASIC = 1; private static final int SILVER = 2; private static final int GOLD = 3; private int level; /* 사용자 레벨 관리 기능 추가로 level 필드를 추가했다. level 필드는 단순히 int .. 2023. 1. 8.
1-4장. 예외 자바 개발자가 가장 신경 쓰기 귀찮아하는 것 중의 하나가 바로 예외처리입니다. 정상적인 결과와 흐름을 보여주는 코드를 만들기도 버거운데 예외상황까지 처리해야 한다는 사실이 부담스러울 수도 있습니다. 그래서 예외와 관련된 코드는 자주 엉망이 되거나 무성의하게 만들어지기 쉽습니다. 때론 잘못된 예외처리 코드 때문에 찾기 힘든 버그를 낳을 수도 있고, 생각지 않았던 예외상황이 발생했을 때 상상 이상으로 난처해질 수도 있습니다. (p.279) 토비님은 코드를 확인할 때 예외 처리가 제대로 되어 있지 않으면 점수를 깎는다고 합니다. 추가로 학습 테스트나 예제를 작성하는 경우에도 예외 처리를 대충 해서는 안된다고 강조합니다. 예외 처리를 할 때 하지 말아야 할 방법으로는 크게 3가지가 있습니다. 예외를 잡고 아무것.. 2023. 1. 8.
1-3장. 템플릿 템플릿이란 이렇게 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경하는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. (p209) 3장에서는 초난감 DAO에 "예외 처리"를 추가하면서 템플릿의 필요성에 대해 설명합니다. 초난감 DAO에 예외 처리를 하기 위해서 try-catch-finally 구문을 사용합니다. Connection c = null; PreparedStatement ps = null; ResultSet rs = null; User user = null; try { c = connectionMaker.makeConnection(); ps = c.prepareStatement( "select.. 2023. 1. 7.