Server/Spring 51

Spring - Servlet과 Spring의 차이!

사실 Servlet과 Spring은 정확한 비교 대상은 아닙니다. 그래서 Servlet과 Spring으로 Servlet을 다루는 것 정도로 이해해주시면 감사하겠습니다. Servlet 처음 웹 서버는 클라이언트 요청에 의해 정적인 컨텐츠만 응답할 수 있었다. 그래서 웹 서버에 프로그램을 붙여서 동적인 페이지를 시작했다. 서블릿도 동적인 페이지를 만들기 위해 웹서버에 붙이는 프로그램 중 하나이다. 만약 이러한 Client 요청이 들어왔을 때 HTTP 원문을 파싱해서 Server Response처럼 HTTP 원문을 만들어서 응답해야 한다면 개발이 힘들 것이다. 모든 규약을 확인한다. 긴 텍스트로 들어온 요청을 분석한다. 거기에 맞는 처리를 한다. 처리한 결과를 규약에 맞춰서 응답으로 보내준다. HttpServ..

Server/Spring 2022.11.16

Spring - 의존성 주입의 3가지 방법 비교!

의존성을 주입하는 방법은 총 3가지가 있다. Field Injection Setter based Injection Constructor based Injection 사실 생성자 주입이 좋다고는 다들 알고 있을 것이다. 그렇다면 왜 생성자 주입이 좋을까? (해당 부분을 더 자세히 정리하고자 포스팅한다.) Field Injection Field Injection은 의존성을 주입하고자 하는 필드에 @Autowired 애노테이션을 붙이면 된다. @RestController public class MemberController { @Autowired private MemberService memberService; } 필드 주입 방식은 아래와 같은 절차로 동작한다. 주입받으려는 빈의 생성자를 호출하여 빈을 찾거나..

Server/Spring 2022.11.08

Spring - consumes와 produces 이해하기!

스프링에서 동일한 URL인데 Content-Type 헤더에 따라 다른 Controller method를 실행시키려면 아래와 같은 RequestMapping 애노테이션의 consumes 속성을 사용한다. @PostMapping(path = "/resources", consumes = MediaType.APPLICATION_JSON_VALUE) 그 뿐만 아니라 Content-Type에 대한 제약을 걸 때도 consumes를 사용하는데, produces 속성과 헷갈리게 되는 경우가 많다. 그래서 consumes는 produces와 어떻게 다른 지 알아보자! consumes 해당 애노테이션의 RequestMapping.consumes의 속성에 대한 description을 확인해봤다. 해당 내용을 번역하면 '미디..

Server/Spring 2022.11.02

Spring - 다중 데이터 소스 환경에서 spring.sql.init이 동작하지 않는 이슈 해결

테스트 코드를 돌릴 때 docker-compose에 MySQL을 띄워서 로컬에서만 테스트하고 있었다. 해당 부분은 자동화할 필요가 있다고 느껴서 테스트 코드에 H2 및 테스트 자동화를 적용하기로 했다.테스트를 수행하기 전에 DDL 스크립트를 실행하도록 처리해야 했다.구현src/test/resources/application.yml에서 아래의 환경 설정을 적용했다.spring: jpa: hibernate: ddl-auto: none sql: init: schema-locations: classpath:sql/order-schema.sql mode: always해당 설정은 Hibernate에서 제공하는 DDL 자동 생성 기능을 사용하지 않고 직접 정의한 sql이 실행..

Server/Spring 2022.10.22

Spring - Request DTO에 NoArgsConstructor의 AccessLevel을 어떻게 설정할까?!

RequestDTO에 NoArgsConstructor(기본 생성자)가 반드시 필요하다. 이유는 @RequestBody를 사용할 때 Jackson2HttpMessageConverter를 사용하기 때문이다. 그러면 RequestDTO에 Lombok의 @NoArgsConstructor 애노테이션을 설정해주었다. @Getter @AllArgsConstructor @NoArgsConstructor public class CreateArtistRequest { @NotBlank private String name; } 이거면 충분할까? 그렇지 않다! Reflection Jackson2HttpMessageConverter는 기본 생성자를 통해 DTO의 인스턴스를 생성한다. 중요한 것은 이때 사용되는 것이 Reflec..

Server/Spring 2022.10.03

Spring - Unique Key를 제어하는 방법 (비교) + Exception 처리!

JPA를 사용하면 아래와 같이 엔터티를 구현합니다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Account implements Serializable { @Id private String id; private String password; private String name; @Column(unique = true) private String phone; @Enumerated(value = EnumType.STRING) private AccountStatus status; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "account_role", joinColumns..

Server/Spring 2022.09.28

Spring - 이미지 조회를 메모리 효율적으로 구현하기! (+ InputStreamResource)

기존에 Image를 조회하는 Controller Method가 있었다. 예시를 살펴보자. Byte[]를 반환 @GetMapping("/attachments/{no}") @ResponseStatus(HttpStatus.OK) public byte[] getImage(..., @PathVariable long no) { // ... 생략 return attachmentStorage.getImageContent(no); } 위와 같이 Controller method에서 byte[]로 이미지의 binary data를 반환해주면, 사용하는 쪽에서 와 같은 방식으로 이미지를 렌더링할 수 있다. 문제는 byte[]를 반환하기 위해서는 해당 파일을 앱서버에서 모두 읽어서 메모리에 보관한 이후에 클라이언트에 반환할 수 ..

Server/Spring 2022.09.27

Spring - Exception 처리 전략 적용기 (+ 에러 코드 문서화!)

최근 Exception에 대한 처리에 관심이 많아져서 관련 포스팅을 썼었다. REST에서 예외를 처리하는 다양한 방법! REST API에서 직접 정의한 Error code를 사용해야 하는 이유! 이번에 공부한 내용들과 추가로 참고 자료를 활용해서 사이드 프로젝트에서 예외 처리 전략을 풀어내보았고, 만족스러운 결과를 얻었다. 코드를 살펴보자. 코드 ErrorResponse 먼저 예외가 발생했을 때 Client 측에 내려줄 ErrorResponse를 정의한다. @Getter @AllArgsConstructor public class ErrorResponse { private final String code; private final String message; } ErrorCode 추가로 위와 같이 Erro..

Server/Spring 2022.09.19

Spring Security - SecurityFilterChain 사용하기! (+ WebSecurityConfigurerAdapter is Deprecated)

WebSecurityConfigurerAdapter 프로젝트 개발을 진행중에 WebSecurityConfigurerAdapter가 Deprecated된 것을 확인했다. Spring Security 5.7.0-M2 부터 해당 클래스는 컴포넌트 기반의 보안 설정을 권장한다는 이유로 Deprecated 처리되었다. @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // configure HTTP security... } @Override p..

Server/Spring 2022.07.18

JPA - Fetch Join에 ON절 추가하는 방법! (쿼리 개선, 인덱싱)

Fetch Join + ON 절 JPA에서 Fetch Join 시 원하는 인덱스를 태우기 위해서 ON절을 추가하고 싶을 때가 있다. 아래의 예를 들어보자. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue private Long id; ... private int countryCode; @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "credit_id") private CreditCard creditCard; public Member(... 생략, CreditCard creditCard, int contryCod..

Server/Spring 2022.07.08