1. 애플리케이션 구현 준비 계층형 구조 사용controller, web : 웹 계층service : 비즈니스 로직, 트랜잭션 처리repository : JPA 를 직접 사용하는 계층, 엔티티 매니저 사용domain : 엔티티가 모여 있는 계층, 모든 계층에서 사용 패키지 구조jpabook.jpashopdomainexceptionrepositoryserviceweb개발 순서 : service, repository 계층 개발하고, 테이스 케이스 작성해서 검증, 마지막에 웹 계층 적용 2. 회원 도메인 개발구현 기능회원 등록회원 목록 조회순서회원 리포지토리 개발회원 서비스 개발회원 기능 테스트 회원 리포지토리 개발[회원 리포지토리 코드]@Repository //스프링 빈으로 등록(Component scan..
1. 요구 사항 분석회원 기능등록, 조회상품 기능등록, 수정, 조회주문 기능주문, 조회, 취소기타 요구사항상품은 재고 관리가 필요하다.상품의 종류는 도서, 음반, 영화가 있다.상품을 카테고리로 구분할 수 있다.상품 주문시 배송 정보를 입력할 수 있다.도메인 모델과 테이블 설계 회원, 주문, 상품의 관계 : 회원은 여러 상품을 주문할 수 있고 한 번 주문할 때 여러 상품을 선택할 수 있어서 주문과 상품은 다대다 관계이다. 하지만 다대다 관계는 거의 사용하지 않기 때문에 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일로 풀어냈다.상품 분류 : 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다.회원 엔티티 분석 회원 (Member) : 이름, 임베디드..
1. 엔티티 매니저 팩토리, 엔티티 매니저 새로운 고객의 요청이 올 때마다 엔티티 매니저 팩토리는 엔티티 매니저를 생성하고 엔티티 매니저는 내부적으로 데이터베이스 커넥션을 사용해서 DB를 사용한다. EntityManagerFactory 생성하는 비용이 크기 때문에 한 개만 만들어 애플리케이션 전체에서 공유한다. 여러 스레드가 동시에 접근해도 안전하다. EntityManager 엔티티의 CRUD 등 엔티티와 관련된 모든 일을 처리한다. 여러 스레드가 동시에 접근을 하게 되면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다. 2. 영속성 컨텍스트 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. EntityManager.persist(member); member 엔티티를 데이터 베이스..
강의 듣던 와중 JPA 실전 편에서 회원 정보 수정을 위해 MemberService에 update 메서드를 추가하는데 갓영한님이 "update 메서드는 엔티티를 바꾸겠다는 변경성 메서드인데, 이 메서드의 return type 을 Member로 한다면 update로 조회를 하는 꼴이 돼요. command와 query 가 같이 있는 꼴이 되죠. 그래서 저는 update 메서드의 return type을 void로 하거나 id 값 정도로 해줘요." 이렇게 말씀하셨다. 무슨 소리인가 싶어서 질의응답을 찾아보니 여러 사람들이 의문을 품고 질문을 했는데 즉 CQS는 기능 구분을 통해 불필요한 side effect를 줄이는 것이다. 여기서 command(명령)는 결과를 반환하지 않고, 시스템의 상태를 변화시키는 것이고..
중복 상관 없이 필수 과목 순서만 유지되면 된다. 큐에 미리 필수 과목을 순서대로 offer 해두고 String을 하나하나 탐색하면서 Q.contain(x)로 확인해본다. 큐 안에 있으면 수강한 거니까 poll 시키고 그 다음 진행한다. import java.util.*; public class Main { public String solution(String need, String plan) { String answer = "YES"; //초기화 Queue Q = new LinkedList(); for(char x : need.toCharArray()) Q.offer(x);//큐에 필수 과목 넣어두기 for(char x : plan.toCharArray()) { if(Q.contains(x)){//x가..
1. 서블릿 예외 처리 - 시작스프링이 아닌 순수 서블릿 컨테이너는 예외를 다음 2가지 방식으로 처리한다.Exception(예외)response.sendError(HTTP 상태 코드, 오류 메시지)웹 어플리케이션에서는 사용자 요청별로 thread가 할당된다. 해당 thread에서 에외가 발생했는데, try-catch로 예외를 처리하지 못한다면 톰캣 같은 WAS까지 예외가 전달된다. WAS는 Exception이 발생하면 서버 내부에서 처리할 수 없는 오류가 발생한 것으로 생각하고 HTTP 상태 코드 500을 반환한다.WAS(여기까지 전파) 이를 확인해보기 위해 기존의 whitelabel.enableds는 false로 변경하고 컨트롤러를 만든다. (스프링 부트가 제공하는 기본 예외 페이지 꺼두기) [Ser..
1. 공통 관심 사항요구 사항을 보면 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야한다. 이전 글에서 로그인을 하지 않은 사용자에게는 상품 관리 버튼이 보이지 않기 때문에 문제가 없어보이지만 사용자가 URL을 직접 호출하면 상품 관리 화면에 들어갈 수 있다는 문제가 있다.그렇다고 해서 로그인이 필요한 모든 컨트롤러 로직에 로그인 여부 확인 코드를 작성하는 것은 비효율적인데다 수정에도 취약하다.이렇게 애플리케이션에서 여러 로직에서 공통으로 관심 있는 것을 공통 관심사(cross-cutting concern)라고 한다.공통 관심사는 스프링의 AOP로도 해결할 수 있지만 웹과 관련된 공통 관심사는 지금부터 설명할 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처..
1. 로그인 요구사항로그인 전 홈 화면회원 가입로그인로그인 후 홈 화면본인 이름(~님 환영합니다.)상품 관리로그 아웃보안 요구사항로그인 사용자만 상품에 접근하고, 관리 가능로그인 하지 않은 사용자가 상품 관리에 접근하면 로그인 화면으로 이동회원 가입, 상품 관리도메인도메인은 화면, UI, 기술 인프라 등등 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말한다.향후에 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다. 이를 위해서 web은 domain을 의존하지만 domain은 web을 의존하지 않아야한다. 즉, domain은 web을 참조해서는 안된다. 2. 홈 화면[HomeController.java]@GetMapping("/")public String home(..