12월 7일 목요일 - TIL

장숭혁·2023년 12월 7일
0

TIL작성

목록 보기
27/60

Stream.reduce()의 내부

  • 이 함수는 Stream의 요소들을 하나의 데이터로 만드는 작업을 수행한다.
    Stream numbers = Stream.of(1,2,3,4,5,6,7,8,9,10);
    Optional sum = numbers.reduce((x,y)->x+y);
    sum.ifPresent(s -> System.out.println("sum : "+ s));
  • 내부적으로 BinaryOperator라는 객체를 받는데 이는 T타입의 인자를 2개 받아서 동일한 T객체를 리턴하는 함수형 인터페이스 이다. BynaryOperator는 (total, n)->total+n 과 같은 형식으로 인자가 전달된다.
  • total(0)+n(1) = 1;
  • total(1)+n(2) = 3;
    .
    .
    .
    total(45)+n(10) - 55;
  • 초기값이 있는 Stream.reduce(init, accumulator)
    Integer sum - numbers.reduce(10,(total,n)->total + n); -> 65
    import java.util.*;
    class Solution {
      public int solution(int[][] sizes) {
          return Arrays.stream(sizes).reduce((a, b) -> new int[]{
                  Math.max(Math.max(a[0], a[1]), Math.max(b[0], b[1])), Math.max(Math.min(a[0], a[1]), Math.min(b[0], b[1]))
          }).map(it -> it[0] * it[1]).get();
      }
    }```
  1. Arrays.stream(sizes)를 사용하여 2차원 배열을 스트림으로 변환한다.
  2. reduce를 이용하여 스트림의 모든 요소를 하나로 줄인다. 여기서 사용된 람다식은 두 개의 배열을 받아 두 개의 배열 중에서 최대 너비와 최대 높이를 찾는다.
  3. reduce의 결과를 바탕으로 최대 넓이와 최대 높이를 곱하여 반환합니다.
  4. get() 메서드를 사용하여 Optional 값을 가져오고 있다.

📐PUT과 PATCH의 차이점

PATCH와 PUT은 HTTP 프로토콜에서 리소스를 수정하는 데 사용되는 메서드이다. 그러나 두 메서드 간에는 몇 가지 중요한 차이가 있다.

PUT 메서드

  • PUT 메서드는 전체 리소스를 업데이트하는 데 사용된다.
  • 클라이언트가 요청 본문에 리소스의 전체 새로운 표현을 제공하여 해당 리소스를 완전히 대체한다.
  • 즉, 클라이언트리소스의 완전한 상태를 알고 있어야 하며, 이를 서버에 제공하여 업데이트한다.
  • 일반적으로 PUT은 리소스의 생성 또는 교체에 사용된다.

PATCH 메서드

  • PATCH 메서드는 리소스의 일부를 수정하는 데 사용된다.
  • 클라이언트는 리소스의 변경된 부분만 요청 본문에 제공하여 서버에 전송한다.
  • 서버는 클라이언트가 보낸 변경 사항을 식별하고 적용하여 리소스를 수정한다.
  • PATCH는 리소스의 부분적인 업데이트나 변경에 사용된다. 예를 들어, 리소스의 특정 필드를 수정하거나 업데이트하는 데 활용될 수 있다.
    요약하자면, PUT은 전체 리소스를 업데이트하는 데 사용되며 클라이언트는 완전한 새로운 리소스를 제공한다. 반면에 PATCH는 리소스의 일부를 수정하며 클라이언트는 변경된 부분만 제공한다. 이 두 메서드는 리소스 업데이트 방식에 있어서 중요한 차이를 가지고 있다.

ResponseEntity

http응답을 나타내는 역할을 한다. RESTful API에서 클라이언트에게 응답을 보낼 때 사용된다. 주요 기능과 목적은 다음과 같다.
1.HTTP 응답 상태 코드 설정 : ResponseEntity는 응다을 HTTP상태 코드를 설정할 수 있다. .status(HttpStatus.CREATED.value())를 사용하여 201 Created 와같은 상태코드를 지정할 수 있다.
2. 응답 본문(body) 설정 : .body 메서드를 사용하여 응답의 본문을 설정할 수 잇따. 이를 통해 JSON , 문자열 또는 다른 객체 등을 클라이언트에게 반환할 수 있다.
3. HTTP 응답 헤더 설정 : ResponseEntity 를 사용하여 응답 헤더를 설정할 수도 있다. 이를 통해 캐시 제어, 콘텐츠 유형, 인증 정보 등을 설정할 수 있다.
4.그러므로 http응답을 커스터 마이징 할수 있다. 상태 코드, 본문, 헤더 등을 원하는 대로 조작할 수 있다.

HTTPServletResponse

JAVA 웹 애플리케이션, 서블릿에서 클라이언트로 HTTP응답을 다루는데 사용되는 객체이다.
다양한 HTTP 응답 관련 작업을 수행할 수 있다.

  1. 응답 상태 코드 설정 : setStatus(int sc) 메서드를 사용하여 HTTP 응답의 상태 코드를 설정할 수 있다. setStatus(HttpServletResponse.SC_OK)는 200 OK 응답 설정한다.

  2. 헤더 설정 : setHeader(String name, String value) 메서드를 사용하여 응답 헤더를 설정할 수 있따. 이를 통해 캐시 제어, 콘텐츠 유형, 인증 정보 등을 설정할 수 있다.

  3. 콘텐츠 작성 : getWriter() 또는 getOutputStream()메서드를 사용하여 응답의 콘텐츠를 작성할 수 있다. HTML, JSON, 이미지 등의 콘텐츠를 클라이언트에게 보낼 수 있다.

  4. 리다이렉트 : sendRedirect(String location) 메서드를 사용하여 클라이언트를 다른 URL로 리다이렉트 시킬 수 있다.

  5. 쿠키 설정 : addCookie(Cookie cookie) 메서드를 사용하여 클라이언트에게 쿠키를 설정할 수 있다.

    ResponseEntity와 HttpServletResponse의 차이점

  • ResponseEntity: Spring 프레임워크에서 사용되는 클래스로, HTTP 응답을 나타내는 데 사용된다. 주로 Spring 컨트롤러에서 클라이언트에게 반환되는 응답을 생성하는 데 사용된다. ResponseEntity는 HTTP 상태 코드, 헤더 및 본문(body)을 포함하여 응답을 정의하는 데 사용된다.

  • HttpServletResponse: Java Servlet API의 일부분으로, 서블릿에서 클라이언트로 HTTP 응답을 보내는 데 사용된다. 이 객체는 서블릿 컨테이너에 의해 관리되며, 서블릿에서 직접적으로 응답을 작성하고 관리하는 데 사용된다. 즉, 웹 애플리케이션에서 서블릿을 사용하여 HTTP 응답을 다룰 때 주로 활용된다.

주요 차이점:

ResponseEntity는 Spring에서 제공하는 클래스로, Spring의 컨트롤러에서 사용되며 더 유연한 방식으로 HTTP 응답을 생성할 수 있다.
HttpServletResponse는 Java Servlet API에 속하는 클래스로, 서블릿에서 사용되며 좀 더 low-level의 HTTP 응답 조작을 가능하게 한다.
ResponseEntity는 주로 Spring 기반의 RESTful API에서 응답을 다룰 때 사용되며, HttpServletResponse는 Java 서블릿에서 직접적으로 HTTP 응답을 다룰 때 사용된다.

JWT 토큰 분석

public Claims getUserInfoFromToken(String token) {
      return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
  }
  • Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();: 이 부분은 주어진 JWT 토큰을 파싱하고, 해당 토큰의 본문(claims)을 추출한다.

  • Jwts.parserBuilder(): JWT 파서를 생성한다.

  • setSigningKey(key): 앞서 초기화된 키(key)를 사용하여 검증에 사용될 서명 키를 설정한다.

  • build(): 설정된 파서를 빌드한다.

  • parseClaimsJws(token): JWT의 유효성을 검사하고, 검증이 완료된 후에 JWT의 내용을 추출한다.

  • getBody(): JWT의 본문(claims)을 반환한다. 여기에는 주로 사용자 정보가 포함되어 있다.
    - Claims: JWT의 본문을 나타내는 클래스이다. 이 클래스는 JWT에 포함된 정보를 표현하고 있는데, 사용자 정보나 기타 클레임(claims)들을 포함하고 있다. 메서드는 해당 본문(claims)을 반환하여 이를 통해 사용자 정보를 액세스할 수 있다.

    • 파싱(parsing) : 특정 형식이나 문법으로 작성된 데이터를 읽고 해석하는 과정
    • 바인딩(binding) : 프로그래밍에서 두 요소를 연결하는 프로세스를 가리킨다. 주로 데이터와 UI요소를 연결하거나 모델과 뷰를 연결하는데 사용된다.
    • 빌드(build) : 프로그래밍에서 소프트웨어를 생성하거나 구성하는 과정을 가리킨다.

    테이블간 관계

    spring에서 다대일(ManyToOne), 일대다(OneToMany) 관계를 표시하는 방법 JPA(JAVA Persistence API)의 어노테이션을 사용하여 설정한다.

    다대일(ManyToOne) 관계

    • 한 개체가 다른 개체 그룹에 속할 때 사용된다. ex- 여러 사용자가 하나의 팀에 속하는 경우

      @ManyToOne // 다대일 관계를 표시
      @JoinColumn(name = "team_id") // 외래키 설정
      private Team team;
    • 여러 개의 User 엔티티가 하나의 Team 엔티티에 속할 수 있음을 나타낸다. 이것은 객체 간의 관계를 매핑하는 것이다.

    • @JoinColumn(name = "team_id"): 이 어노테이션은 외래 키(foreign key)를 매핑하는 데 사용된다. team_id라는 컬럼이 User 테이블에 생성되고, 이 컬럼은 Team 엔티티의 primary key를 참조한다. 즉, team_id 컬럼을 통해 User 엔티티의 각 레코드가 어떤 Team 엔티티에 속하는지를 나타낸다.

      외래키(Foreign Key)의 주인 : 주인이 되는 쪽은 보통 데이터의 생성, 변경, 삭제 등의 작업에서 중요한 역할을 하며, 이러한 작업에서 외래키 제약 조건 등을 고려하여 관계를 유지하거나 유연하게 다루는 데 도움이 된다. 주인이 아닌 쪽에서는 해당 관계를 참조만 할 수 있으며, 주인 쪽에서 변경이 일어날 때 그 영향을 받게 된다.

      @GeneratedValue(strategy = GenerationType.IDENTITY) : 엔티티의 기본 키(primary key)를 자동으로 생성하기 위한 전략을 지정하는 어노테이션이다.

      • @GeneratedValue 어노테이션은 이러한 키를 자동으로 생성하기 위해 사용한다
      • strategy 속성을 사용하여 생성 전략을 지정할 수 있다.
      • GenerationType.IDENTITY 전략은 주로 데이터베이스의 자동 증가(auto-increment) 기능을 활용하여 키를 생성한다.

      일대다(@OneToMany) 관계

    • 해당 필드는 여러 개의 엔티티를 가질 수 있으며, 다른 하나의 엔티티와의 일대다 관계를 정의한다.

      @OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
      private List<User> users;
      
    • @OneToMany: 이 어노테이션은 users 필드가 여러 개의 User 엔티티를 가지고 있음을 나타낸다. 즉, 하나의 Team 엔티티는 여러 개의 User 엔티티와 관계를 맺을 수 있다. 이것은 객체 간의 관계를 매핑하는 것이다.

    • mappedBy = "team": mappedBy 속성은 이 관계가 양방향 관계임을 나타낸다. User 엔티티에 있는 team 필드를 기준으로 매핑된 것을 의미한다. 이것은 일대다 관계의 주인(Owner)을 User 엔티티의 team 필드로 설정하고, Team 엔티티는 이를 역참조하여 양방향 관계를 형성한다.

    • cascade = CascadeType.ALL: CascadeType.ALL은 연관된 엔티티에 대해 부모 엔티티의 변경 사항을 전파하는 방식을 지정한다. 여기서는 User 엔티티에 대한 변경이 Team 엔티티에도 전파되도록 설정되었으므로, Team 엔티티를 저장하거나 삭제할 때 연관된 모든 User 엔티티도 함께 저장 또는 삭제한다.

profile
코딩 기록

0개의 댓글

관련 채용 정보