본문 바로가기

WEB

(22)
[JPA] 7장 복합 키와 식별 관계 매핑 복합 키와 식별 관계 매핑 데이터베이스 테이블 사이 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분한다. 식별 관계 (Identifyng Relationship) 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계 비식별 관계(Non-Identifyng Relationship) 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계 그리고 외래 키에 NULL 을 허용하는지에 따라 필수적 비식별 관계와 선택적 비식별 관계로 나눈다. 필수적 비식별 관계(Mandatory) 외래 키에 NULL을 허용하지 않는다. 연관관계를 필수적으로 맺어야 한다. 선택적 비식별 관계(Optional) 외래 키에 NULL을 허용한다. 연관..
[JPA] 2장 JPA 시작 2.3 라이브러리와 프로젝트 구조 메이븐 라이브러리를 관리하고 빌드함 라이브러리 관리 기능 = 자바 애플리케이션을 개발하려면 jar 파일로 된 여러 라이브러리가 필요하다. 과거에는 이런 라이브러리를 직접 내려받아 사용했다. 메이븐은 사용할 라이브러리 이름과 버전만 명시하면 라이브러리를 자동으로 내려받고 관리 빌드 기능 = 애플리케이션을 빌드하는 표준화된 방법을 제공 gradle 기본 메이븐의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있다. JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리 hibernate-core : 하이버네이트 라이브러리 hibernate-enti..
[Spring Security] 스프링 시큐리티란? 스프링 시큐리티에 대해서 알아보기 전 간단하게 개념 확인하겠습니다! 🎨 What is Servlet? 웹 기반의 요청에 대해 동적으로 처리해주는 역할입니다. 해당 URL에 기반한 HTTPservletRequest를 생성하고 response 결과를 전송합니다. request 객체에 있는 정보들을 꺼내서 사용, response 객체에 정보를 편리하게 입력 🎨 What is Servlet Container? 서블릿은 요청을 받거나 내보낼 때, 자신이 알아서 하는 것이 아니라 서블릿을 실행시키는 주체인 서블릿 컨테이너라는 것을 이용합니다. 즉, Servlet을 관리한다는 Servlet Container는 어떤 요청에 대해 어떤 Servlet을 실행할 것인지 제어하는 것이죠. 더 쉽게 말하면,, 서블릿이 웹서버와..
[JPA] JPA와 JPA의 필요성 💡 JPA(Java Persistence API) = 자바로 영속 영역을 처리하는 API JPA 상위 개념은 ORM(Object Relational Mapping)이라는 패러다임으로 이어짐 → 이는 객체 지향으로 구성한 시스템을 ⇒ 관계형 데이터베이스에 매핑하는 패러다임이다. JPA를 이용하는 개발의 핵심은 객체지향을 통해서 영속 계층을 처리하는 데 있음 → JPA를 이용할 때는 테이블과 SQL을 다루는 것이 아니라 ❌ 데이터에 해당하는 객체를 엔티티 객체라는 것으로 다루고 JPA로 이를 데이터베이스와 연동해서 관리한다. 💡 JPA의 필요성 객체와 관계형 데이터베이스의 차이연관관계 - 상속테이블은 외래 키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID 객체는 Member에서 Team으로는..
빈 생명주기 콜백 빈 생명주기 콜백 시작 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.(안전하게 종료 처리시키는 것이 필요하다) (참고 : 마치 TCP/IP 연결할 때 오래 걸리니까 미리 DB 와 연결해놓는 데이터베이스 커넥션 풀과 같은 개념이라고 생각하면 된다.) [예제] 간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. (서버가 뜰 때 미리 외부 네트워크에 연결) 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다. 이 NetworkClient 는 애플리케이션 시작 시점에 connect() 를 호출 -> 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disCon..
같은 타입인 여러 개의 빈들을 조회하고 싶을 때 조회한 빈이 모두 필요할 때 의도적으로 정말 해당 타입의 스프링 빈이 다 필요한 경우도 있다. 예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate - 비율로 할인, fix - 고정금액 할인)를 선택할 수 있다고 가정해보자. 스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다. package hello.core.autowired; import hello.core.AutoAppConfig; import hello.core.discount.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; //import org.junit.jupiter.api.Assertio..
Lombok 라이브러리의 @RequiredArgsConstructor 롬복과 최신 트랜드 막상 개발을 해보면, 대부분이 다 불변이고, 그래서 다음과 같이 필드에 final 키워드를 사용하게 된다. 그런데 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 하고...(매우 귀찮다) 필드 주입처럼 좀 편리하게 사용하는 방법은 없을까? -> 롬복으로 해결 가능하다! [롬복 추가] 프로젝트 시작할 때 롬복을 설치하지 않았기 때문에 build.gradle에 다음과 같은 코드를 추가하자(처음에 롬복을 추가했으면 이 과정을 뛰어넘어도 된다) //lombok 설정 추가 configurations{ compileOnly{ extendsFrom annotationProcessor } } dependencies { implementation 'org.springframework..
의존관계 주입 4가지 방법과 생성자 주입 권장 이유 다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. (1) 생성자 주입 (2) 수정자 주입(setter 주입) (3) 필드 주입 (4) 일반 메서드 주입 [1] 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 우리가 진행했던 방법이 바로 생성자 주입이다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memb..
예외 처리(@ExceptionHandler) - 예시 코드를 중심으로 스프링에서 예외 처리하는 3가지 방법 1. try - catch “각 메소드” 안에서 처리 2. 어노테이션 @ExceptionHandler -> 이 방법을 적용하여 설명 예정 “컨트롤러 자체”에서 처리 @controller, @RestController가 적용된 Bean 내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능 Controller 내부에서 호출한 Service에서 예외가 발생 시 에러 처리 대상이 된다. 예외 처리 메시지를 예외 발생마다 새롭게 작성하면 번거롭고 복잡하다ㅜ 이젠 한 번에 처리해보자! 3. Global level에서 처리 → 추천 클라이언트에서 전달되기 직전에 처리 [ 실행흐름 ] [컨트롤러에서 예외 발생] 에러가 터지면 Dispatcher Servlet을 통해 Ex..
@ComponentScan의 탐색 위치와 대상 탐색 위치와 기본 스캔 대상 탐색할 패키지의 시작 위치 지정 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다. @ComponentScan( basePackages = "hello.core", } basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다. 예를 들어 basePackages = "hello.core.member"라고 한다면 member 패키지를 포함한 하위 패키지들만 탐색한다. basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다. basePackageClasses = AutoApp..