전체 글 146

[스프링 핵심 원리 - 기본편] 싱글톤 컨테이너

웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생 대부분의 스프링 애플리케이션은 웹 애플리케이션. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있음. 웹 애플리케이션은 보통 여러 고객이 동시 요청 고객 요청이 올 때마다 새로운 memberService 생성함. 우리가 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때마다 객체를 새로 생성 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸됨 -> 메모리 낭비가 심함 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. -> 싱글톤 패턴 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그래서 객체 인스턴스를..

DAO와 Mapper 인터페이스

1. DAO란? Data Access Object의 약어로 실질적으로 DB에 접근하여 데이터를 조회하거나 조작하는 기능을 전담하는 객체를 말한다. DAO의 사용 이유는 효율적인 커넥션 관리와 보안성 때문이다. DAO는 저수준의 Logic과 고급 비즈니스 Logic을 분리하고 domain logic으로부터 DB 관련 mechanism을 숨기기 위해 사용한다. 2. Mapper란? MyBatis 매핑 XML에 기재된 SQL을 호출하기 위한 인터페이스이다. 3. Mapper 인터페이스를 사용하지 않을 경우 SQL Session을 등록해줘야 한다. DAO 인터페이스와 인터페이스를 구현한 DAO클래스를 생성해줘야한다. Mapper인터페이스를 사용하지 않았을 때는 네임스페이스 + "." + SQL ID로 지정해서 ..

Back-End/Study 2022.08.14

@RequiredArgsConstructor - Dependency Injection

@RequiredArgsConstructor 초기화되지 않은 final 필드나, @NonNull이 붙은 필드에 대해 생성자를 생성해 줌. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다. final 필드에 대해 생성자를 만들어주는 lombok의 annotation Spring Framework의 DI(의존성 주입) 중 Constructor Injection(생성자 주입)을 임의의 코드 없이 자동으로 설정 @RequiredArgsConstructor 적용 전 @Component public class LombokTest { private final MyService myservice; private final String id; @Autowired public Lom..

Back-End/Study 2022.08.11

DAO와 Repository 차이

영구 저장소 API 문제점 우리는 MySQL, Oracle, MongoDB 등 다양한 영구 저장소의 구현체를 사용해왔다. 그리고 어플리케이션에서 이러한 저장소에 접근하기 위해 벤더별로 저장소에서 제공하는 API를 통해 접근해왔다. 이 과정에서 어떤 문제가 있었을까. 구현체와 로직의 강한 결합 문제 만약 MySQL과 같은 특정 벤더의 영구 저장소를 사용하고 있을 때, Oracle로 변경해야 한다면 MySQL의 API를 사용한 모든 구현을 변경해주어야 하는 불편함이 생긴다. 계층 간 간섭 문제 레이어가 깨지는 문제는 결국 강한 결합 문제로 연결된다. MySQL의 API를 서비스 로직에서 사용했을 경우, 서비스 로직과 DB와 관련된 API가 강한 결합을 가지게 되어 영속성과 관련된 로직이 서비스 로직에 영향을..

Back-End/Study 2022.08.10

Lombok 라이브러리 어노테이션

@Getter @Setter 각각 접근자와 설정자 메서드를 작성해주는 Lombok 어노테이션으로 유명하다. 또, 생성자를 자동 생성해주는 Lombok 어노테이션에는 @NorgsConstructor 파라미터가 없는 기본 생성자 생성 @AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자를 만들어 줌 @RequiredArgsConstructor final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어 줌 toString() 메소드를 작성하는 일도 @ToString 어노테이션만 붙여주면 자동으로 생성해 줌 @ToString(exclude = "id")와 같이 exclude를 사용하면 toString() 결과에서 id를 제외시킬 수 있음 //사용할 때 User user = ..

Back-End/Study 2022.08.04

JPAQueryFactory

쿼리 만들기 QueryDSL을 사용하기 위해서는 먼저 QueryDSL이 제공하는 JPAQueryFactory 클래스의 인스턴스를 생성해야 한다. JPAQuertFactory queryFactory = new JPAQueryFactory(em); EntityManager를 ㅈ입하여 인스턴스를 생성해야 함 Spring Boot를 사용하면 다음과 같이 QueryFactory를 각 로직마다 주입해 줄 필요 없이 필드로 빼도 동시성 문제없이 각각 별도의 영속성 컨텐스트를 제공받아 작동함 @SpringBootTest @Transactional public class QueryDslBasicTest{ @Autowired EntityManager em; JPAQueryFactory queryFactory; public..

Back-End/Study 2022.08.01

유효성 검사 - @NotNull @NotEmpty @NotBlank

Java에서는 Bean Validation이라는 데이터 유효성 검사 프레임워크를 제공하고 있다. Spring에서 이 기능을 이용하면 더 유효성 검사를 편리하게 할 수 있다. build.gradle dependencies{ implementation 'org.springframework.boot:spring-boot-starter-validation' } spring에서 사용하기 위해 Spring Boot Vaildation Starter를 추가한다. @NotNull @NotEmpty @NotBlank @NotNull Null 값 체크 @NotEmpty Null, "" 체크 @NotBlank Null, "", 공백을 포함한 빈 값 체크

Back-End/Study 2022.07.30

[Spring Error] Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

Error 발생 해결 방안 - 연결 테이블을 구현하다가 오류가 발생하였음. MenuToProduct.java @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @IdClass(MenuToProductId.class) public class MenuToProduct implements Serializable { @Id @ManyToOne @JsonBackReference @JoinColumn(name="menu_id") private Menu menu; @Id @ManyToOne @JsonBackReference @JoinColumn(name="product_id") private Product product; } 여기서 @IdClass(Men..

Back-End/Issues 2022.07.29

순환참조 해결 @JsonIgnore, @JsonManagedReference, @JsonBackReference

사용 방법 일단 이를 사용하기 위해서는 build.gradle 설정이 필요함. 다음을 dependencied에 추가 순환 참조 JPA는 디폴트로 매핑된 데이터에 대해 FetchType.LAZY (게으른 불러오기)를 사용함. 예를 들어, User라는 Entity와 Account라는 Entity가 서로 양방향 참조 (1:N)을 하고 있다고 하자. public class User{ @Id private Long user_id; ... @OneToMany(mappedBy = "user") private List accounts; } public class Account{ @Id private long id; ... @ManyToOne @JoinColumn(name="user_id") private User us..

Back-End/Study 2022.07.29