본문 바로가기

반응형

Spring

(53)
재사용성과 다이나믹 디스패치, 더블 디스패치 보호되어 있는 글입니다.
SpringFramework에서의 싱글톤 전략 애플리케이션 동작 영역 (JVM 내) 에서 단 하나의 인스턴스만 만들어야할 경우, 또는 리소스 절약을 위해 하나의 인스턴스만 만들고 이를 공유하도록 설계하고자 할 경우, 싱글톤 패턴을 적용한다. 자바 언어를 이용해서 싱글톤 패턴을 적용할 수 있다. 인스턴스는 public static final 맴버로, 생성자는 private으로 설정하고 해당 맴버를 반환하는 getInstance 메서드를 생성하여, 이 메소드를 통해서만 인스턴스를 가져올 수 있도록 설정해주면 된다. 그러나 여기에는 몇가지 문제점이 있다. 싱글톤 패턴을 구현하는 코드 자체가 복잡해진다. 의존 관계상 클라이언트가 구현체 클래스에 의존한다 -> DIP 위반 구현체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. 테스트가 어렵다. (mo..
Spring Boot Web MVC Spring Web MVC docs.spring.io/spring-framework/docs/5.0.7.RELEASE/spring-framework-reference/web.html#mvc Step1 HTTP Request 가 들어오면, 앞단에서 DispatcherSevlet이 해당 요청에 맞는 Controller 정보를 HandlerMapping 정보를 통해 가져온다. Step2 HandlerMapping에서 찾은 Controller를 호출한다. 이때, Handler의 추가 파라미터와 모델 정보와 함께 호출할 수 있다. Step3 요청을 받은 Controller는 요청에 응답으로 생성할 View에 담을 Model 정보를 생성한다. 이때 필요하다면, Service 단에서 비즈니스 로직을 처리할 수 있고,..
Spring Boot JPA 활용1 Spring Boot JPA 활용 1 Field Injection보다 Constructor Injection을 사용하자. 스프링에서 등록된 빈을 사용하기 위한 3가지 DI(Dependency Injection) 방법을 제공한다. 필드 주입(Field Injection) 수정자 주입(Setter Injection) 생성자 주입(Constructor Injection) 그러나, Spring 3점대 이후 버전에서는 필드 주입 방식을 권장하지 않는다. 인텔리 제이에서도 필드 인젝션을 사용할 경우 다음과 같이 경고 메시지를 띄운다. 그리고, Spring 4.3 부터는 Setter 메소드 인젝션보다 생성자 인젝션 방식을 권장한다. 그 이유는 다음과 같다. 단일 책임의 원칙 위반 의존성을 주입하기가 쉽다. @Auto..
Spring Data JPA - H2 연동 Spring Boot Starer 애플리케이션으로 H2 데이터베이스 연동하는 방법 스프링 부트의 경우, persistence.xml 으로 설정을 하지 않아도 된다. Spring boot 의 auto configuration 기능으로 자동 설정을 해주기 때문이다. 단지, main/resources/application.yml 파일에 datasource 관련 정보만 세팅 해주면 된다. spring: datasource: url: jdbc:h2:tcp://localhost/~/store username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: tr..
JPQL(Java Persistence Query Language) - 2 JPQL 경로 표현식 경로 표현식이란 "."을 통해 객체 그래프를 탐색하는 것 상태 필드(state field): 단순히 값을 저장하기 위한 필드 ex> u.username 연관 필드(association field): 연관관계를 위한 필드 단일 값 연관 필드에 대한 탐색 단일 값 연관 필드란? @ManyToOne, @OneToOne, 대상이 엔티티 ex> user 와 user의 team 단일 값 연관 필드 조회 시에는 묵시적 내부 조인(inner join) 발생한다. ex> u.team.name 또한 대상 엔티티의 속성에 대한 탐색이 가능하다. ex> u.team.name List usersTeam = entityManager.createQuery("select u.team from User as u"..
JPQL(Java Persistence Query Language) - 1 JPQL(Java Persistence Query Language) JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. JPQL 문법 select u from User as u where u.age > 10 엔티티와 속성은 대소문자 구분한다. User 는 엔티티 age는 속성 JPQL 키워드는 대소문자 구분하지 않아도 된다. (SELECT, FROM, where) 테이블의 이름이 아닌 엔티티 이름 사용한다. tbUser 가 아닌 User. 문법상 별칭은 필수이다. (as는 생략가능) TypeQuery, Query TypeQuery :..
JPA 쿼리 가능한 선택지 JPQL JPA Criteria QueryDSL Native SQL JDBC API, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 이란? JPA를 사용하면 엔티티 객체를 중심으로 개발이 가능하다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 하지만 모든 데이터베이스의 데이터를 객체로 변환해서 검색하는 것은 불가능하다. 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. 이러한 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공한다. SQL과 문법이 유사하고, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 이 지원된다. JPQL은..

반응형