본문 바로가기
관리자

Programming-[Backend]

(421)
[스프링 기초] 13. 의존관계 주입 : 4가지 방법 의존관계 주입방법은 크게 4가지이다. 생성자 주입 수정자 주입 필드 주입 일반 메서드 주입 1. 생성자 주입 가장 많이 사용하고 효용성이 있는 방법이다. 생성자 호출 시점에 1번만 호출되는 것이 보장된다. 즉 불변, 필수 의존관계에 사용한다. 가장 많이 사용되는 방식이다. 생성자가 1개만 있으면 @Autowired를 생략해도 빈이 자동으로 주입된다. final을 사용하자 필수적이고 불변하는 관계이므로, 주입받는 객체를 final로 선언하는 방식을 주로 적용한다. 이렇게 하는 이유는, final 키워드 없이 선언 시에 생성자부분에서 오타가 발생하거나, 의존관계에 대한 부분을 작성하는 것을 누락하는 경우가 발생할 수 있기 때문이다. 이런 상황에서는 컴파일 이후에야 잘못된 부분을 찾을 수 있는데, final ..
[스프링 기초] 12. 컴포넌트 스캔(Component Scan) 1. 컴포넌트 스캔 개념 @ComponentScan, @Component 이때까지 컨테이너의 설정 정보 작성은 적은 수의 스프링 빈으로 작성하였다. 그러나 실무에서는 수 십, 수 백개의 빈들을 등록하고, 관리해야되는 문제가 발생한다. 스프링은 이런 문제를 해결하기 위해 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다. @ComponentScan은 말그대로 @Component 애노테이션이 붙은 클래스들을 스캔한다. @Configuration 내부에 있는 @Component도 스캔하므로, @Configuration은 filter로 제외한다(예제 코드상 다른 위치에 @Configuration이 붙어있는 클래스가 있기 때문). 이때 스프링 빈의 기본이름은 해당 클래스명을 맨 앞글..
[스프링 기초] 11. 싱글톤(Singleton) 1. 싱글톤 개념 Spring으로 다른 애플리케이션을 개발할 수도 있지만, 보통은 웹 애플리케이션을 개발한다. 그리고 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 요청때마다 계속 객체가 생성되고 소멸되는 형태인데, 이렇게 되면 메모리 낭비가 심하다. 그러나 순수한 자바가 아닌 스프링을 이용하면 클래스의 인스턴스가 1개만 생성되어 그것을 공유해서 사용하게 된다. 이러한 방식을 싱글톤 패턴이라고 한다. 싱글톤 적용 기본 원리 이러한 싱글톤 방식을 구현하기 위해서, 자바의 private 접근 지정자 방식을 활용한다. 어떤 클래스가 호출되었을 때 적용되는 생성자를 private으로 처리해서 외부에서 해당 클래스의 인스턴스가 만들어지는 것을 막는다. 이렇게 해서 new 키워드를 통해서 인스턴스가 만들..
[스프링 기초] 10. Bean Factory와 BeanDefinition 1. BeanFactory와 ApplicationContext BeanFactory는 Spring에서 사용하는 컨테이너들의 최상위 컨테이너이다. ApplicationContext는 BeanFactory의 모든 기능들을 상속받을 뿐 아니라, MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader 등의 부가기능들을 상속받는다. 그래서 보통 BeanFactory를 사용하기보단 Application Context를 사용한다. 부가기능 MessageSource : 메시지를 공통화 하고, 다른 국가권에서 접속 시에 언어를 변경해서 출력할 수 있도록 해준다. EnvironmentCapable : 로컬, 개발, 운영 등을 구분해서 처리할..
[TIL] Unique Id 아닌 값을 바탕으로 조회 및 update 할 때, findTopBy 다음 그림과 같이 Unique 값이 아닌 Id 값이 있는 경우가 있어서는 안되지만 있을 수도 있다. 그런데 만약 이 contact_id값을 바탕으로 객체를 불러와서 업데이트 하는 상황이라면, 일단 엔티티 객체를 조회할 때 contact_id에 해당하는 모든 엔티티 객체를 List 형태로 불러오고 List 내부의 모든 엔티티 객체의 값을 업데이트 하는 것이 바람직할 것이다. 상황에 따라 다르겠지만, 그렇게 해야 contact_id를 통해 값을 조회했을 때 일관성있는 결과값을 기대할 수 있게 된다. 차선의 방법으로, JPA에서의 findTop 메서드를 활용하여 쿼리 결과가 1개만 나오도록 해야 쿼리 결과상 문제가 발생하지 않는다. 쿼리 결과는 엔티티 객체 1개만 리턴하도록 지정해뒀는데, contact_id로..
[TIL] 커스텀 Exception 만들기 : @ExceptionHandler, @ResponseStatus, @RestControllerAdvice, super() 1. 목적과 상황 클라이언트에서 온 HttpRequest에 대해서 Exception을 통해 Http status와 Json 코드를 HttpResponse로 반환하고자 한다. 다음 코드와 같이 특정 엔티티 객체를 찾고자 했는데, 못찾았을 경우 orElseThrow()를 통해 특정 Exception을 반환하는 상황이다. XxxEntity xxxEntity = xxxRepository.findById(id) .orElseThrow(() -> new CustomException("xxx.error.not.found")); CustomException은 여러가지 Exception들을 한 번에 모아놓고 @RestControllerAdvice로 처리하는 클래스 파일 내부에 정의한다. @Slf4j @RestContro..
[TIL] Querydsl cannot find symbol 에러 Querydsl을 사용하다보면 Repository에서 Q객체들을 생성할 수 없다고 하면서, querydsl cannot find symbol.. 에러가 발생한다. 구글링해보면 annotation processor 설정 문제라던가, Graven에서 querydsl의 참조 경로를 다시 지정해줘야 한다는 해결책들이 나와있다. 한가지 더 추가하자면, maven으로 프로젝트를 하는 경우 repository가 아니라 다른 클래스 파일에서 문제가 발생해서, 해당 오류 부분 때문에 Q객체를 생성하지 못하는 경우가 많았다. 생각해보면 멀쩡하게 잘 되던 build가 안되는 이유는, 내가 무언가를 바꾸었기 때문일 확률이 높다. 다른 사례들에서 보여주는 원인과 해결책은 설정이나 환경 문제인데 프로그래밍을 하면서 이런 설정들을..
[TIL] @JsonNaming 으로 Camel Case 필드값 Snake Case로 자동변환 @JsonNaming으로 클래스에 선언된 필드값들을 Camel Case로 작성하고 실제로 API를 통해 json 방식으로 데이터를 내보내거나, 받아올 때는 Snake Case로 자동으로 변환된다. 예를 들어 아래와 같이 companyId라고 작성된 필드는 외부와 API 통신을 하는 Swagger 문서에서는 company_id라고 표현된다. @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)