본문 바로가기

전체 글

[Spring] @RequestParam / @ModelAttribute / @RequestBody / @Requestpart 스프링에서 HTTP 요청으로 넘어오는 데이터를 어떻게 받아야 하는지에 대해 명확한 개념정의 없이 사용하다보니, 때때로 문제를 일으키기도 한다. 물론 제대로 적용하고 있을 때조차, 왜 이 어노테이션을 사용해야 하는지 모르고 사용하는 경우도 많다. 회사에서는 Binary 데이터가 포함되는 파일 전송의 경우에는 모두 @ModelAttribute 로 처리하고 있었는데, API는 Frontend와 통신함에 있어 모두 Json 형식으로 통신하고 있기 때문에, 굳이 Model 객체를 반환하지 않음에도 불구하고, ModelAttribute를 쓰는것이 맞는가에 대한 의문이 들었다. 물론 ModelAttribute가 단순히 Model 객체를 사용하는 목적이 아니기도 한 것 같아, 이 기회에 더 자세히 알아보고자 한다. @.. 더보기
[Spring] @Configuration, @Bean 으로 의존성 주입(DI) 하기 기존에 순수 Java 코드를 사용하여 DIP와 OCP를 준수하여 의존성을 주입하는 코드를 알아보았다. 스프링 컨테이너를 사용하면 이러한 부분들을 훨씬 간편하게 사용할 수 있다. ( 2022.03.06 - [개발/Java] - [Java]순수 자바 코드로 DIP와 OCP를 준수하는 방법 ) 먼저 간단한 설정 사례를 보자 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemberRepository(); .. 더보기
[Java] Enum 에 대해 실무를 진행하다보면 요구사항에 따라 수많은 분기처리가 되는 경우가 있다. 가장 심플하게 해결하자면 if 문으로 도배하면 되는데 (나야 나) 현실적으로 그렇게 처리하면, 구현하면서도 스스로 헷갈리고, 코드를 보는 사람의 입장에서도 굉장히 고달픈 일이 된다. 물론 적절한 분기처리를 수행하지 못해 예상과는 다른 결과가 도출되는 것은 덤. 실무에서는 이렇게 분기처리가 많을 경우 Enum을 사용하면 깔끔하게 정리하고 가독성도 높일 수 있다. 최근에도 사용하게 된 케이스가 있었는데 사실 사용하면서도, 실제로 Enum이 얼마나 더 많은 활용도를 가지고 있는지는 깊게 고민해보지 못했다. 실제 다른 기술 블로그들을 참고해보면 Enum의 기능에 대해 이야기하고 있는데, 살펴보자면 1. 데이터들 간의 연관관계를 표현해준다... 더보기
[Spring] Security의 인가(Authorization) 실패 시 처리 기존 프로젝트에서 스프링 시큐리티 사용에 있어, 인가 실패 시 스프링이 제공하는 기본 예외를 반환하고 있어, 내가 원하는 Json 형태로의 반환을 위해 추가로 커스텀이 필요했다. 당연히 스프링 시큐리티에서 예외처리 커스텀이 가능한 기능을 지원하고 있다. AccessDeniedHandler 인터페이스를 구현받고 handle 메소드를 재정의 한 후, 시큐리티 설정에 추가해주면 된다. 우선 Jwt와 시큐리티 예외처리를 동일한 형식으로 처리하기 위한 Response Writer 용 static method를 만들었다. public class CommonWriter { private static String convertToJson(Object object) { try { return new ObjectMappe.. 더보기
[Spring] Security와 Jwt 사용을 통한 인증, 인가 도입기 토이 프로젝트를 진행하면서, 초기 설정을 하는데 고생을 많이 했는데, 그 중에서도 특히 Spring Security와 Jwt를 동시에 적용하는 부분이 잘 되지 않았다. 특히 스프링부트 3 이후에 시큐리티 부분 설정도 바뀐부분이 있어서, 기존 구글링 한 검색 결과들에서 조금씩 맞지 않는 부분들도 있었다. (라고 하기에는 충분히 많은 참고 자료들이 있기는 했다..) 1. 의존성 추가 build.gradle 내에 spring security와 jwt 의존성을 추가해준다. //security implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-s.. 더보기
[Spring] Bean을 Collection으로 호출하기 최근 실무를 진행하면서 여전히 많이 부족함을 느낀 일이 있었다. 어떻게 보면 여전히 기본기가 부족하다고 할 수 있는 사건. 정책에 따라 생성된 Bean을 Map 컬렉션을 통해 호출하는 코드를 보았는데, 바로 이해하지 못했다. 프로젝트 전역적으로 보아도 해당 Map에 Bean을 put 해주는 코드는 존재하지 않았던 것. 대략적인 코드는 아래와 같은 구조였다. @Service @RequiredArgsConstructor public class MyService { private final Map myBeanMap; private MyBean getMyBean(String beanName) { return myBeanMap.get(beanName); } } MyBean 객체는 상속을 통해 다형성을 활용한 구현.. 더보기
@Embedded, @Embeddable JPA 엔티티를 구성함에 있어, 엔티티를 DB중심적이기 보다는, 객체지향적으로 만들고자 한다면 임베디드 타입을 사용하면 좋다. 임베디드 타입은 코드의 재사용을 가능하게 하고, 응집도를 높여준다. @Embedded : 값 타입을 사용하는 곳에 표시 @Embeddable : 값 타입을 정의하는 곳에 표시 * 기본 생성자 필요 위와 같이 Embeddable 로 설정한 값들을 Entity에 Embedded로 지정해줄 수 있다. 이렇게 되면, 다른 Entity에도 Embedded로 같은 값들로 지정이 가능하게 된다. Entity를 저장할때는 아래와 같이 한다. DB에는 Embeddable 클래스의 변수들이 각각의 값이 컬럼으로 저장된다. 출처 : https://velog.io/@seongwon97/Spring-B.. 더보기
[DB] Entity에 catalog 옵션이 있을 경우 실무 환경에서 설계를 하다보면, DB 스키마가 분리되어 있는 경우가 있다. 특히 JPA를 사용하는 환경에서 스키마가 분리되는 경우는 그다지 권장되지는 않는 듯 하지만, 어쩔수 없는 경우도 있으니까.. @Entity @Table(name = "my_entity", catalog = "second_schema") public class MyEntity {...} 메인 스키마가 있는 경우 다른 스키마에 테이블이 있는 경우 Entity의 Table 어노테이션에 catalog 옵션을 주어 JPA 테이블이 해당 엔티티를 바라보도록 설정할 수 있었다. 문제는 테스트코드 작성시 H2 Database를 사용하고 있었는데, 기본 설정만으로는 해당 테이블을 인식하지 못해 테스트를 통과하지 못하고 있다는 것이다. 이 때 테스.. 더보기