본문 바로가기
Spring

Spring 기본 (create, update, delete)

by code2772 2022. 12. 8.

[ 목차 ]

    728x90
    반응형

    ✔ Spring 기본

    Gradle
    - 의존성 관리의 다양한 방법을 제공하는 기술
    - maven은 xml을 사용, gradle은 groovy라는 언어를 사용
    - 오픈소스 빌드 도구(개발시 자동으로 빌드를 도와주는 프로그램)
    
    ORM(Object-Relational Mapping)
    - 객체와 관계형 DB를 매핑
    - 객체를 마치 자바 컬레션에 저장할 수 있고, 적절한 SQL을 생성해서 DB객체에 저장
    
    JPA(Java Persistence API)
    - 자바의 ORM 기술 표준
    - 객체를 DB에 저장하고 관리할 때 개발자가 직접 SQL을 작성하지 않으도 됨
    - JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고 객체를 자동으로 Mapping
    - 스프링 부트는 ORM 프레임워크(Hibernate)가 탑제되어 있음
    
    POJO(Plian Old Java Object)

    ✔ DB 연결 -> application.properties

    ✔ build.gradle -> maven reoisitory에서 확인 -> 유료버전에서 maven안가고 한번에 실행도 가능

    ✔lombok -  https://mvnrepository.com/artifact/org.projectlombok/lombok

    lombok
    - 태아블을 구조화한 클래스(Entity, DTO, VO)에서 getter/setter 메소드와 toString(),
    equals(), hashCode() 등의 메소드르르 어노테이션으로 사용할 수 있도록 해주는 라이브러리
    @Data : 자동으로 getter/setter를 지원
    @AllArgsConstructor : 모든 매개변수를 지원하는 생성자를 지원
    @NoArgsConstructor : 매개변수를 갖지 않는 생성자를 지원
    @EntityL DB : 테이블과 연결
    @Builder  : 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서
    서로 다른 표현의 결과를 만들 수 있도록 패턴으 사용(체이닝->함수형 프로그램)

    ✔ JPA - https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa

    JPA Hibernate Entity 생성하기
    -  어노태이션
    @Table: DB의 테이블의 이름을 명시(테이블명과 클래스명이 동일한 경우 생략)
        admin_user(DB) == AdminUser(Java)
         스네이크 표기          커맬 표기
    //@Table(name ="admin_user") 테이블 명

    ✔ DB - https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/8.0.31

    @Entity : DB의 테이블을 뜻하는 클래스
    @Id : primary key를 뜻함
    @GeneratedValue : primary key의 키 생성 전략(Strategy)을 설정할 때 사용
    @column : DB 필드명을 명시(DB필드명과 클래스 필드명이 동일한 경우 생략한다)
    @Transient : DB에는 존재하지 않은 필드에 명시
    JPA Repository
    - Spring Data JPA의 구현체인 Hibernate를 이용한기 위한 API
    - JpaRepository의 제네릭 타입으로는 <Entity, PK타입>을 지정
    - 자동으로 스프리으이 빈(Bean)으로 등록됨
    - 꼭 존재해야 하는 것은 아님
    
        public interface 인테페이스명 extends JpaRepository<테이블명, pk타입>{
            SQL 쿼리를 대신할 메소드 정의
    }
    

    Adminuser newAdminUser = adminuserRepository.save (adminuser) 를 사용하기 위해

    Test(Junit)
    - Java의 단위 테스팅 도구
    - Test Class를 그대로 남김으로써 추후 개발자들에게 테스트 방법 및 클래스의 History를 넘겨줄 수 있음
    - @Test
    
    DI(Dependency Injection) : 의존성
    - 클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것
    예) 클래스A가 클래스 B, C와 상호작용을 한다면 객체A는 객체 B, C와 의존관계다!
    
        A ----------------------> B // B에서 C로 바뀔려면
                                  C
    
    DI가 필요한 이유 : 객체간의 의존성
    
    DI유형 (의존관계에 있는 Bean을 주입하는 방법)
    1. Setter Injection
        - setter/getter 메서드의 setter 메서드를 통해 의존관계에 있는 객체를 주입
    2. Constructor Injection
        -생성자를 통해 의존 관계에 있는 객체를 주입
    3. Method Injection
        - 메소드를 통해 의존 관계에 있는 객체를 주입
    

    ✔ @ Autowired

    @Autowired
    - 스프링 ID에서 사영하는 어노테이션
    - 스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고
        인스턴스가 자동으로 주입

     

    ✔ Optional<T>
    - Integer나 Double 클래스과 같이 'T' 타입의 객체를 포장하는 Wrapper Class
    (Optional의 인스턴스는 모든 타입의 참조 변수를 저장 가능)
    - NullPointerException 예외를 예방하기 위한 좋은 방법)
    - 시작(객체생성) -> 중간(Optional 객체 반환) -> 끝(체이닝 종료) 3단계로 구현
    - 함수형 프로그래밍, 메소드 체이닝을 가능하게 함
    🔏 시작(객체생성)
    - of()
        null이 아닌 명시된 값을 저장한 optional 객체를 반환
        null이 저장될 경우, NullPointException 예외를 발생시킴
    - ofNullable()
        null이 아닌 명시된 값을 저장한 optional 객체를 반환
        null이 저장될 경우, 비어있는 optional 객체를 발생시킴
    - empty
        비어있는 optional 객체를 반환
    
    🔏 중간
    - filter()
       입력값이 참이면 기존 optional 객체를 드개로 반환
       입력삽이 거짓이면 비어있는 optional 객체를 반환
        ✔ 입력값은 functional interface로 매개변수를 특정 연산으로 체크하여 boolean
        값을 반환함(특정 연산이란 람다식으로 표현함)
    - map()
        optional 객체에 저장된 값을 map() 내의 함수를 통해 반환하고, 변환값을 담은
        optional 객체에 반환
    
    🔏 끝
    - ifPresent()
        optional 객체가 비어있지 않다면, 저장된 값을 가지고 ifPresent() 내의 연산을 수행
        optional 겍체가 비어있다면, 그대로 반환(아무 연산 수행X)
    - isPresent()
        optional 객체가 비어있지 않다면, true를 반환
        optional 객체가 비어있다면, false를 반환
    - get()
        optional 객체가 비어있지 않다면, 저장된 값을 꺼내 반환
        optional 객체가 비어있다면, NoSuchElementExeption을 반환
    - orElse()
        optional 객체가 비어있지 않다면, 그대로 반환(아무 연산 수행X)
        optional 객체가 비어있다면, 기본값으로 제공할 객체를 지정
    - orElseGet()
        optional 객체가 비어있지 않다면, 그대로 반환(아무 연산 수행X)
        optional 객체가 비어있다면, 기본값으로 제공할 공급자 함수를 지정(람다 표현식의 결과값 반환)
    - orElseThrow()
        optional 객체가 비어있지 않다면, 그대로 반환(아무 연산 수행X)
        optional 객체가 비어있다면, 기본값으로 제공할 예외 공급자 함수를 지정 예외 Throw
    
    ❗ orElse는 optional 객체가 비어있지 않던, 비었던 무조건 실행!
    ❗ orElseGet은 비어있을 때만 실행!
    
    

     

    ✔ CREATE 

    DB에 입력하는 내용 -> Adminuser 클래스를 사전에 만들어 두고

    @Builder를 사용하여 하위 부분을 사용할 수 있다. Adminuser adminuser = Adminuser.builder() ~~(입력하고 싶은 부분)

    Adminuser newAdminUser = adminuserRepository.save (adminuser) 의 save를 통해 생성할 수 있다.

    ✔ UPDATE

    Optional<AdminUser> : Adminuser 클래스의 모든 타입의 변수를 저장한다. 

    findById() : () 안에 있는 ID통해 select를 한다.

    admiUser.ifPresent : adminuser 내에  위에서 찾는것이 있으면 { }안에 있는 내용을 실행

    selectUsers -> { } : selectUsers를 만들어 내부에 있는 내용을 확인 후 변경 

    LocalDateTime.now() : 자바에서의 현제시간을 의미한다.

     

    ✔ Delete

    UPDATE와 유사하다. 다른 부분은 adminUserRepository에서 save에서 delete로 변경 된 부분이 전부이다.

    반응형