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();
}
}```
PATCH와 PUT은 HTTP 프로토콜에서 리소스를 수정하는 데 사용되는 메서드이다. 그러나 두 메서드 간에는 몇 가지 중요한 차이가 있다.
http응답을 나타내는 역할을 한다. RESTful API에서 클라이언트에게 응답을 보낼 때 사용된다. 주요 기능과 목적은 다음과 같다.
1.HTTP 응답 상태 코드 설정 : ResponseEntity는 응다을 HTTP상태 코드를 설정할 수 있다. .status(HttpStatus.CREATED.value())를 사용하여 201 Created 와같은 상태코드를 지정할 수 있다.
2. 응답 본문(body) 설정 : .body 메서드를 사용하여 응답의 본문을 설정할 수 잇따. 이를 통해 JSON , 문자열 또는 다른 객체 등을 클라이언트에게 반환할 수 있다.
3. HTTP 응답 헤더 설정 : ResponseEntity 를 사용하여 응답 헤더를 설정할 수도 있다. 이를 통해 캐시 제어, 콘텐츠 유형, 인증 정보 등을 설정할 수 있다.
4.그러므로 http응답을 커스터 마이징 할수 있다. 상태 코드, 본문, 헤더 등을 원하는 대로 조작할 수 있다.
JAVA 웹 애플리케이션, 서블릿에서 클라이언트로 HTTP응답을 다루는데 사용되는 객체이다.
다양한 HTTP 응답 관련 작업을 수행할 수 있다.
응답 상태 코드 설정 : setStatus(int sc) 메서드를 사용하여 HTTP 응답의 상태 코드를 설정할 수 있다. setStatus(HttpServletResponse.SC_OK)는 200 OK 응답 설정한다.
헤더 설정 : setHeader(String name, String value) 메서드를 사용하여 응답 헤더를 설정할 수 있따. 이를 통해 캐시 제어, 콘텐츠 유형, 인증 정보 등을 설정할 수 있다.
콘텐츠 작성 : getWriter() 또는 getOutputStream()메서드를 사용하여 응답의 콘텐츠를 작성할 수 있다. HTML, JSON, 이미지 등의 콘텐츠를 클라이언트에게 보낼 수 있다.
리다이렉트 : sendRedirect(String location) 메서드를 사용하여 클라이언트를 다른 URL로 리다이렉트 시킬 수 있다.
쿠키 설정 : addCookie(Cookie cookie) 메서드를 사용하여 클라이언트에게 쿠키를 설정할 수 있다.
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 응답을 다룰 때 사용된다.
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)의 어노테이션을 사용하여 설정한다.
한 개체가 다른 개체 그룹에 속할 때 사용된다. 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(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 엔티티도 함께 저장 또는 삭제한다.