728x90

java 129

[Spring] 프레젠테이션 층의 설계와 구현

1. 프레젠테이션 층이란 - 프레젠테이션 층은 사용자 인터페이스와 컨트롤러를 말한다. - 프레젠테이션 층에서는 스프링MVC와 스프링 웹 플로를 이용할 수 있다. 2. 스프링 MVC와 REST - URL을 자유롭게 결정할 수 있다. - HTTP 메소드에 따라 실행할 처리를 전환할 수 있다. - URL의 일부를 쉽게 추출해 사용할 수 있다. 3. 스프링 MVC의 구성 요소 이름 역할 DispatcherServlet - 프론트 컨트롤러를 담당 - 모든 HTTP 요청을 받아들여 그 밖의 오브젝트 사이의 흐름을 제어 - 기본적으로 스프링 MVC의 DispatcherServlet 클래스를 그대로 적용 Handler Mapping - 클라이언트의 요청을 바탕으로 어느 컨트롤러를 실행할 지 결정 Model - 컨트롤러..

[JPA] 스프링 데이터 - 확장 기능

김영한님의 실전! 스프링 데이터 JPA 정리 1. 사용자 정의 리포지토리 구현 - 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 - 다양한 이유로 인터페이스의 메소드를 직접 구현하고 싶다면? (1) JPA 직접 사용(EntityManager) (2) 스프링 JDBC Template 사용 (3) MyBatis 사용 (4) 데이터베이스 커넥션 직접 사용 등등.. (5) Querydsl 사용 - 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } - 사용자 정의 인터페이스 구현 클래스 ..

[JPA] 스프링 데이터 - 쿼리 메소드 기능

김영한님의 실전! 스프링 데이터 JPA 정리 1. 메소드 이름으로 쿼리 생성 - 메소드 이름을 분석해서 JPQL 쿼리 생성 - 이름과 나이를 기준으로 회원을 조회하려면? // 순수 JPA public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } // 스프링 데이터 JPA public interface MemberReposit..

[JPA] 스프링 데이터 - 공통 인터페이스 기능

김영한님의 실전! 스프링 데이터 JPA 정리 1. 공통 인터페이스 설정 - JavaConfig 설정 - 스프링 부트 사용 시 생략 가능 @Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {} - 스프링 부트 사용 시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식) - 만약 위치가 달라지면 @EnableJpaRepositories 필요 - 스프링 데이터 JPA가 구현 클래스 대신 생성 - org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상 -> memberReposito..

[JPA] 객체지향 쿼리 언어 - 중급 문법

1. 경로 표현식 - .(점)을 찍어 객체 그래프를 탐색하는 것 - 경로 표현식 특징 (1) 상태 필드(state field) 경로 탐색의 끝, 탐색 X (2) 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색 O (3) 컬렉션 값 연관 연관 경로: 묵시적 내부 조인 발생, 탐색 X (4) FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능 - 명시적 조인, 묵시적 조인 (1) 명시적 조인: join 키워드 직접 사용 select m from Member m join m.team t (2)묵시적 조인: 경로 표현식에 의해 묵시적으로 SQL 조인 발생(내부 조인만 가능) select m.team from Member m - 실무 조언 (1) 가급적 묵시적 조인 ..

[JPA] 객체지향 쿼리 언어 - 기본 문법

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리 1. JPQL - JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. - JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. - JPQL은 결국 SQL로 변환된다. 2. 문법 - select m from Member as m where m.age > 18 - 엔티티와 속성은 대소문자 구문 O(Member, age) - JPQL 키워드는대소문자 구분 X(SELECT, FROM, where) - 엔티티 이름 사용, 테이블 이름이 아님(Member) - 별칭은 필수(m) (as는 생략 가능) TypeQUery, Query - TypeQuery: 반환 타입이 명확할..

[Spring] 비즈니스 로직 층의 설계와 구현

비즈니스 로직 층의 역할은 도메인 모델인지, 트랜잭션 스크립트인지 관계없이 업무 처리(비즈니스 로직)를 하는 것 비즈니스 로직과 밀접한 관계가 있는 트랜잭션 처리는 잘 대응해야 함 5.1 트랜잭션이란? - 트랜잭션이란 관련된 여러 처리를 하나의 큰 처리로 취급할 경우의 단위 - 트랜잭션 내의 모든 처리가 성공했을 때 트랜잭션이 확정 - 트랜잭션 내에서 하나라도 실패할 경우 트랜잭션이 시작하기 전의 상태로 롤백 (1) 여러 업무에 걸쳐진 트랜잭션 예) 고객이 주문한 상품을 공장에 발주하고 물건이 도착하면 고객에게 출하하기 전까지의 트랜잭션 단위 (2) 하나의 사례에서 사용자로부터의 여러 요청에 걸쳐서 발생하는 트랜잭션 예) 상품의 재고를 화면에 표시하고, 출하할 상품 수를 입력한 후 확정 버튼을 누르기까지..

[JPA] 값 타입

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리 1. JPA의 데이터 타입 분류 - 엔티티 타입 (1) @Entity로 정의하는 객체 (2) 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 나이 값을 변경해도 키는 식별자로 인식 - 값 타입 (1) int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 (2) 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 2. 값 타입 분류 - 기본값 타입 (1) 자바 기본 타입(int, double) (2) 래퍼 클래스(Integer, Long) (3) String - 임베디드 타입(embedded type, 복합 값 타입) - 컬렉션 값 ..

[Spring] 데이터 액세스 층의 설계와 구현

4.1 데이터 액세스 층과 스프링 - 데이터 액세스 층은 데이터 액세스 처리를 비즈니스 로직 층에서 분리하여 따로 만들어준 층 - 데이터 액세스 처리와 비즈니스 로직이 섞여있으면 유지보수가 어렵고, 코드 가독성이 떨어진다. 4.1.1 DAO 패턴이란? - DAO 패턴은 데이터의 취득, 변경 등 데이터 액세스 처리를 DAO라고 하는 오브젝트로 분리하는 패턴 - 데이터 액세스 방식이 바뀌어도 DAO만 변경하면 된다. - DAO 클래스는 DB의 테이블별로 만든다. 4.1.2 자바의 데이터 액세스 기술과 스프링의 기능 - 자바의 데이터 액세스 기술 (1) JDBC (2) 하이버네이트 & JPA 등 고성능 ORM 프레임워크 (3) MyBatis(iBATIS) (4) 독자 개발한 프레임 워크 등 - 스프링은 여러 ..

[Java] Map안에 Map 안에 List 만들기

회사에서 Java, Spring Boot, Thymeleaf로 작업하고 있다.화면에 테이블을 그리는데, (A, B 영역 / ㄱ, ㄴ, ㄷ 교재 / 1, 2 유닛)Aㄱ12ㄴ1Bㄷ11이런 식으로 그려줘야 했다.Javascript로 할 수도 있었지만, 최대한 로직을 Java쪽에서 만들어주기로 했기 때문에 Map>> 이러한 형태로 만들어서 화면에서 그릴 생각이었다.// 화면으로 보낼 최종 맵Map>> resultMap = new LinkedHashMap();// 임시 맵Map> tempMap = new LinkedHashMap();// 전체 데이터List studyDto = xxxService.findStudyByUserId(userId);맵을 먼저 만들어 놓고 전체 데이터에서 맵에 넣어줄 생각이다.// 영역 ..

728x90