Spring
-
[Spring] Entity 설계 시 연관관계의 주인을 설정하는 법Spring 2021. 11. 9. 18:39
연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 안된다. 예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다(많은) 쪽에 외래 키가 있으므로 외래 키가 있는 바퀴를 연관관계의 주인으로 정하면 된다. 물론 자동차를 연관관계의 주인으로 정하는 것이 불가능 한 것은 아니지만, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키값이 업데이트 되므로 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 있다. 연관관계의 주인이 아닌 곳은 읽기만 가능하며, 주인은 mappedBy 속성사용을 하지 않으며, 주인이 아니면 mappedBy 속성으로 주인을 지정한다. 단방향 매핑만으로도 이미 연관관계..
-
[Spring] spring boot entity에 enum 사용시 주의사항Spring 2021. 11. 9. 18:29
enumtype에는 두가지 종류가 있다. string, ordinal ordinal이 디폴트 값이며, ordinal은 DB에 숫자로 들어가며, string은 문자 그래도 들어간다. 얼핏 들으면 ordinal이 편해보이지만 여기엔 큰 단점이 있다. 바로 컬럼값이 추가될 경우 인덱스가 다 바뀌어 디비가 엉망이 된다. 그러니 항상 변경을 고려해서 디폴트값인 ordinal을 쓰지말고 string을 써야한다. 출처 : 스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지 (inflearn.com)
-
[Spring] 쿼리문 콘솔창에서 쉽게 확인하는 법Spring 2021. 11. 8. 16:08
jpa를 사용할 때 실제 디비에 전해지는 쿼리의 파라미터를 정확하게 알고싶을 때, 외부 라이브러리를 쓰면 좋다. gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth (github.com) GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s Spring Boot integration with p6spy, datasource-proxy, f..
-
[Spring] 웹 스코프와 requestSpring 2021. 11. 4. 20:48
싱글톤은 스프링 컨테이너의 시작과 끝까지 함께하는 매우 긴 스코프이고, 프로토타입은 생성과 의존관계 주입, 그리고 초기화까지만 진행하는 특별한 스코프이다. 그리고 두개와 다른 웹스코프라는 것이 존재한다. 웹 스코프의 특징 - 웹 스코프는 웹 환경에서만 동작한다. - 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프 종류 - request : HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다. - session : HTTP session과 동일한 생명주기를 가지는 스코프 - application : 서블릿 컨텍스트(ServletContext)와 동일한 생명주..
-
[Spring] 빈 생명주기 콜백과 그 방법Spring 2021. 11. 4. 16:49
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 어플리케이션 시작 시점에 필요한 연결을 미리 해두고, 어플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링을 통해 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보고, 방법을 얘기한다. 보통 객체의 생성과 초기화를 구분지어야 한다. 이는 유지보수 관점에서 장점을 가져가기 때문인데, 이렇게 생성과 초기화를 분리하게 되면, 개발자는 객체의 의존관계 주입 완료 시기를 알기 쉽지 않다. 때문에 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다. 따라서 안전하게 종료작..
-
[Spring] 조회한 빈이 모두 필요할 때 방법Spring 2021. 11. 4. 16:20
의도적으로 정말 해당타입의 스프링 빈이 다 필요한 경우도 있다. 예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자. 스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다. public class AllBeanTest{ @Test void findAllBean(){ ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member..
-
[Spring] 스프링 빈의 자동, 수동의 올바른 실무 운영 기준Spring 2021. 11. 4. 15:09
설정 정보를 베이스로 어플리케이션을 구성하는 부분과 실제 동작하는 부분을 명확하게 나누는 것은 이상적이지만, 개발자 입장에서 스프링 빈을 하나 등록할 때 @Component만 넣어주면 끝나는 일을 몇차례로 나누는 과정은 상당히 번거롭다. 자동 빈등록을 사용해도 OCP, DIP를 지킬 수 있는 상황에서 자동을 사용하지 않을 이유는 없다. 그럼에도 불구하고, 수동을 사용할 때 장점이 있는 상황은 있다. 어플리케이션은 크게 업무 로직과 기술 로직으로 나눌 수 있다. - 업무 로직 빈 : 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리등이 모두 업무 로직이다. 보통 비즈니스 요구사항을 개발할 때 추가되거나 변경된다. - 기술 지원 빈 : 기술적인 문제나 공통..
-
[Spring] JPA 설정 및 사용Spring 2021. 10. 11. 15:53
jpa를 쓰기에 앞서 몇가지 설정이 필요하다. build.gradle 파일의 디펜던시에서 첫번째줄을 삽입해줘야한다. spring boot starter data jpa는 jdbc관련 라이브러리를 포함한다. resources/application.properties 파일에도 수정할 것이 있다. spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none 이 두 줄을 넣어줘야 하는데, 첫째 줄의 의미는 jpa로 날린걸 sql로 볼 수 있게 해준다. 둘째 줄은 원래 jpa를 쓰면 객체를 보고 테이블까지 만들어 버린다. 그래서 이미 만들어놨거나 그 기능이 필요없는 경우 none으로 끄고 시작하면 된다. JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다..