ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot #3
    Java/Spring 2023. 5. 16. 09:11
    • REST API
      • 반복되는 문제 상황을 해결하기 위한 도구이다
      • 제약조건
        • 클라이언트-서버
          • 리소스를 관리하는 서버가 존재하고, 다수의 클라이언트가 리소스를 소비하기 위해 네트워크를 통해 서버에 접근하는 구조를 의미한다
        • 상태가 없음
          • 클라이언트가 서버에 요청을 보낼 때 이전 요청의 영향을 받지 않음을 의미한다.
          • Login페이지에서 다음 페이로 넘어갔을때 이전요청페이지를 알고 있으면 상태가 있음 반대면 없음
        • 캐시가능한 데이터
          • HTTP에서는 cache-control이라는 헤더에 리소스의 캐시 여부를 명시할 수 있다.
        • 일관적인 인터페이스
          • 시스템 또는 애플리케이션의 리소스에 접근하기 위한 인터페이스가 일관적이여야 한다는 뜻
          • 리소스에 접근하는 방식, 요청의 형식, 응답의 형식이 애플리케이션 전반에 걸쳐 URI, 요청의 형태와 응답의 형태가 일관적이어야 한다는 것이 일관적인 인터페이스 방침이다.
        • 레이어 시스템
        • 서버는 인증서버, 캐싱서버, 로드 밸런서를 거쳐서 최종적으로 애플리케이션에 도착한다고 하자. 이사이의 레이어들은 요청과 응답에 어떤 영향을 미치지 않으며 클라이언트는 서버의 레이어 존재 유무를 알지 못한다
        • 코드 온-디맨드
        • REST는 HTTP와 다르다 REST는 HTTP를 이용해 구현하기 쉽고, 대부분 그렇게 구현하지만 엄밀히 말하면 REST는 아키텍처이고, HTTP는 REST 아키텍처를 구현 할 때 사용하면 쉬운 프로토콜이
    • @RestController
      • HTTP관련된 코드 및 요청/응답 매핑을 스프링이 알아서 해준다
      • HTTP 요청 처리
      • 요청 매개변수 처리
      • 데이터 변환
      • 응답 상태 코드 설정
      • 예외 처리
      • 경로
        • RestController에서만 경로를 쓸 수 있는 것은 아니고 GetMapping에서도 경로를 쓸 수 있다.
    • @Path Variable
      • required
        • 매개변수가 꼭 필요한건 아니라는 것으로 매개변수가 없다면 null로 처리가 된다
        • wapper클래스를 사용하는것이 null처리에 수월하다
    • @RequestParam
      • 파라미터로 넘어오는 변수를 받아올 수 있다
      • default value를 사용하면 기본값을 사용할 수 있다
      • 래퍼클래스를 쓰는것이 좋다
    • @RequestBody
      • 반환하고자 하는 리소스가 복잡 할 때 사용한다(회원가입)
      • 해당 어노테이션이 없다면 기본값을 쓰고, 값이 있다면 그 값을 쓴다
    • @ResponseBody
      • 클라이언트가 요청한 데이터를 처리 후 그 결과를 ResponseBody에 담아 반환한다
    • 서비스레이어 : 비지니스 로직
      • 컨트롤러와 퍼시스턴스 사이에서 비지니스 로직을 수행하는 역할을 한다
      • http와 긴밀히 연관된 컨트롤러에서 분리돼 있고, 데이터베이스와 긴밀히 연관된 퍼시스턴스와도 분리돼 있다
    • @Service
      • 클래스 레벨에 사용하면 이 클래스는 스프링 컴포넌트이며 기능적으로는 비지니스 로직을 수행하는 서비스 레이어임을 알려주는 어노테이션이다
      • @Component를 포함하고 있다
    • JPA
      • 자바에서 데이터 베이스 접근, 저장, 관리에 필요한 스펙이다
      • 스펙을 구현하는 구현자를 JPA PRovider라고 부르고 대표적인 JPA Provider가 Hibernate이다
      • JPA와 H2는 같이 사용해야 한다
    • H2
      • In-Memory로 실행하는경우 앱 실행 시 테이블을 생성하고 종료시 테이블도 함께 사라진다
    • Entity
      • 클래스 그 자체가 테이블을 정의해야 한다
      • 어떤 필드가 기본키 인지 외래키 인지 구분할 수 있어야 한다
      • 주의사항
        • NoArgsConstructor
        • Getter/Setter
        • Primary Key(@id)지
        • 위 3가지가 있어야 한다
    • @Table
      • 어노테이션을 추가하지 않거나 추가하더라도 name을 명시 하지 않았다면 @Entity의 이름을 테이블 이름으로 간주한다 Entity에도 명시하지 않았다면 클래스의 이름을 테이블이름으로 간주한다
      • 코드
      • @NoArgsConstructor @AllArgsConstructor @Data @Builder @Entity @Table(name = "Todo") public class TodoEntity { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") private String id; // 이 오브젝트의 아이디 private String userid;// 이 오브젝트를 생성한 유저의 아이디 private String title;// Todo 타이틀 예)운동 하기 private boolean done;// true - todo를 완료한 경우(checked) }
      • @id
        • 기본키가 될 필드를 지정한다
    • @Generator
      • incremental
      • sequence
      • identity
      • 임의의 값을 생성하는데 사용 될 수 도 있습니다.
    • @GeneratedValue
      • id를 자동으로 생성 하겠다는 뜻이다
    • JpaRepository
      • 인터페이스 이고, 첫번쨰 매개변수 T는 테이블에 매핑할 엔티티클래스이고, ID는 이 엔티티의 기본 키 타입 입니다.
    • 구현순서
      • 퍼시스턴스(TodoRepository.java)→서비스(TodoService)→컨트롤러(TodoController)으로 구현한다
    • Create Todo구현
      • 퍼시스턴스 구현
        • JpaRepository를 상속하므로 제공하는 메서드를 사용할 수있다
        • 엔티티를 저장하기 위해서 save메서드를 사용하고 새 Todo리스트를 반환하기 위해 finByUserId()메서드를 사용한다
      • 서비스 구현
        • 검증 : 넘어온엔티티가 유효한지 검사하는 로직, 로직이 커지면 따로 분리 시킨다
        • save() : 엔티티를 데이터베이스에 저장한다
        • finByUserId : 저장된 엔티티를 포함하는 새 리스트를 리턴한다
      • 컨트롤러 구현
        • 유제에게서 TodoDTO를 요청 바디로 넘겨 받고, 이를 TodoEntity로 변환해 저장해야 하며 TodoService의 create()이 리턴하는 TodoEntity를 TodoDTO로 변환해 리턴해야 한다
    • final
      • 중간에 값이 바뀌거나 런타임시에 객체에 대한 값이 바뀔것을 고려해서 final을 준다 (그럼 인스턴스 생성을 막는다)
      • setter를 호출 할수 없고, 코드에 대한 통일성을 주기 위함이다
    • 제네릭

    'Java > Spring' 카테고리의 다른 글

    Spring boot #6  (0) 2023.05.22
    Spring boot #5  (0) 2023.05.18
    Spring #28  (0) 2023.05.01
    Spring #27  (0) 2023.05.01
    Spring #26  (0) 2023.05.01
Designed by Tistory.