• Controller, domain, Repository, Service 의 기본 구조
    • Spring에서 사용자의 호출부터 DB까지 이어지는 흐름은, Controller부터 시작하여 Controller -> Service -> Repository -> DB까지 이어지는 계층구조를 보임.

    • 예를 들어, Student객체에는 id, name, email, age등의 요소가 정의되고 이 Student객체를 domain 또는 데이터베이스의 테이블과 대응되어 엔티티라 부름.

    • 이 Student객체가 DB에 저장되기 위해서, 데이터베이스와 인터페이싱 하여 도메인 객체를 저장하고 관리하는 역할을 하는 것이 Repository의 역할.

    • 서비스는 핵심 로직을 구현하는데 사용되며, 컨트롤러(Controller)와 리포지토리 사이에서 중간 역할을 하고, Student 객체 생성, 유효성 체크 등의 비지니스로직을 담당.

      Untitled

    • 컨트롤러 : 사용자의 요청에 대한 url패턴, input/output의 형태 등을 정의

    • 서비스 : 핵심 비즈니스 로직 구현

    • 리포지토리 : DB에 접근, 도메인객체를 DB에 저장하고 관리

      • DAO(Data Access Object) 계층
    • 도메인 : 테이블명과 컬럼명 등 모델 객체 정의

  • 도메인 생성
    • @Entity
      • 클래스명 위에 붙는 어노테이션으로, 데이터베이스 테이블 매핑 되어, JPA사용시에 mysql의 테이블을 자동생성(jpa특화 어노테이션)
      • 클래스의 객체변수를 사용하여 컬럼을 자동생성 해주는 역할
      • JPA (Java Persistence API)의 엔티티 매니저(Entity Manager)에 의해 관리
        • 객체의 생명주기(생성, 읽기, 업데이트, 삭제)를 관리
    • id변수
      • DB에 pk로 지정하기 위해 @Id사용
      • 데이터 생성시, 자동으로 1값씩 증가시키도록 @GeneratedValue(strategy = GenerationType.IDENTITY) 사용
        • 이 전략은 데이터베이스가 자동으로 키 값을 증가시켜주는 기능을 사용
    • java의 변수타입과 DB타입이 적절하게 변환
      • String은 varchar로 변환되어 저장
      • Long은 bigint로 변환되어 DB에 저장
    • 모든 컬럼은 변수명과 DB의 컬럼명이 동일하게 생성 및 관리
      • 만약 변수명과 컬럼명을 다르게 하고 싶다면 아래와 같이 지정 @Column(name = “username") private String name;
    • Column관련 옵션
      • @Column(name = "username", nullable = false, length = 50)
      • @Column(unique = true) 등
  • DTO 계층 사용
    • Member 객체를 있는 그대로 사용하지 않고 MemberReqDto와 같은 DTO(Data Transfer Object) 계층을 별도로 두어 계층 분리
    • DTO 사용 주요 이유
      • 역할분리
        • MemberReqDto는 주로 클라이언트와 서버 간 데이터 전송을 목적으로 역할분리
      • 보안성과 데이터 보호
        • Member 엔터티에는 비밀번호, 사용자 권한, 기타 민감한 정보가 포함될 수 있어 보안상 위험
        • DTO를 사용하여 필요한 정보만 클라이언트에 전송
      • 필요한 데이터를 전달
        • DTO를 사용하면 특정 요청에 여러 엔티티를 조립하여 필요한 데이터를 전달하는 것도 가능
  • toEntity, fromEntity 패턴
    • reqDto에서 toEntity 사용하여 Member객체로 변환
    • resDto에서 fromEntity사용하여 resDto로 변환
    • dto → entity 변환 코드의 공통화 처리 가능
  • DB 연동
    • MARIA DB 설치 및 스키마 생성
      • 스키마 생성은 jpa ddl auto로 생성되지 않음에 유의
    • spring.datasource 설정
      • url, username, pw등
    • mybatis사용시 mybatis mapper위치 지정
    • spring.jpa관련 설정
      • mysql 엔진 설정 (innoDB 등)
      • ddl auto 여부 설정(create, update, validate모드 등)
  • domain, Repository, Service 의 특징
    • Controller, Service, Repository는 매번 객체를 생성할 필요가 없는 성격을 가지고 있으므로, 스프링에서는 일반적으로 싱글톤(SingleTone)을 지향
      • 싱글톤(스프링빈)은 스프링이 단 하나의 인스턴스만 생성하고, 이를 재사용한다는 의미
    • 각각 어노테이션을 붙이게 될경우, 자동으로 싱글톤으로 등록이 되고 이를 사용하기 위해서 주입만 받으면 되는 형식
    • 일반적으로 도메인 객체는 싱글톤으로 사용될수는 없기에 모든 사용자에 대해 매번 New 클래스();를 통해 객체 생성
  • 종류별 repository 생성
    • SpringDataJpa

      Untitled

      • repository에서 JpaRepository 인터페이스 상속
        • 이때 JpaRepository를 상속하는 MemberRepository 또한 인터페이스
        • MemberRepository에는 JpaRepository의 기능을 구현한 구현체가 런타임에 주입
        • 스프링 데이터 JPA는 JpaRepository인터페이스의 구현체를 런타임에 자동으로 생성
        • 즉, 개발자는 이러한 인터페이스에 대한 구현체를 작성할 필요가 없고, 스프링 데이터 JPA에 의해 제공되는 구현체를 사용
        • 기본으로 지원되는 조회,생성,수정,삭제 메서드는 선언없이 바로 사용이 가능하고, 메서드 추가시에도 메서드 이름 규칙을 따라 메서드 쉽게 추가하여 자동구현
      • 자바 지속성 API(Java Persistence API)
        • 영속성 컨텍스트는 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할
        • 커밋하기 전까지 데이터를 보관하는 역할
      • JPA는 자바에서 ORM(Object-Relational Mapping)기술 표준으로 사용되는 인터페이스
        • JPA는 개발자가 더이상 쿼리를 직접 만들지 않아도 되도록 해줌
        • JPA를 통해 SQL과 데이터 중심 설계에서 객체 중심 설계가 가능하게 함
      • hibernate
        • JPA는 자바 표준 인터페이스로서 데이터베이스와의 상호 작용을 추상화
        • Hibernate는 JPA의 구현체 중 가장 많이 사용되는 구현체
        • 실질적으로 jpa == hibernate라고 생각해도 무방
      • EntityManager
        • EntityManager는 Java Persistence API (JPA)의 핵심 인터페이스
        • 객체와 데이터베이스 사이의 상호작용을 관리
        • 엔티티 객체의 생명주기를 관리하고, 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 수행
        • 주요 기능
          • 엔티티 관리
            • EntityManager는 영속성 컨텍스트(Persistence Context)라는 메커니즘을 사용하여 엔티티의 상태를 관리
            • 엔티티가 영속성 컨텍스트에 의해 관리되면, JPA는 이 엔티티의 상태 변경을 영속적으로 문맥을 추적하고 데이터베이스와 동기화
          • 트랜잭션 관리
          • 쿼리 실행
          • 엔티티 생명주기 관리
    • 순수 JPA(네이티브 JPA)

    • Mybatis 인터페이스

    • JDBC 클래스

  • Service 생성
  • Controller 생성
  • DI(의존성주입)
  • Component와 Bean