Springboot 22

[springboot] 07-21 ~ 07-27

이번주는 바빠서 TIL을 많이 쓰지 못하였기에, 프로젝트 진행 간 발생했던 에러들을 모아서 작성하려고 한다. 1. NullPointException: ... "this.logger" is null log사용 시 Slf4j가 아닌 invoke를 import해서 발생한 에러. 이후에 slf4j를 호출하여 해결했다. 2. RuntimeException: ... Not Found email을 PK로, username을 UK 지정했었다. 협업 진행 시 서로간 의견이 원활히 전달되지 않아 email - username을 서로 비교하는 코드가 작성되었다. 당연히 어떤값을 넣더라도 NotFound가 발생했다. 이후에 email로 비교하기로 협의하여 수정하였다. 3. ApplicationContextException m..

Springboot 2023.07.27

[Springboot] DAO, DTO, VO

DAO DB의 data에 접근하기 위한 객체. DB에 접근 하기 위한 로직 & 비즈니스 로직을 분리하기 위해 사용한다. 직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다. DTO 계층 간 데이터 교환을 하기 위해 사용하는 객체. 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스) VO VO(Value Object) 값 오브젝트로써 값을 위해 쓰임 read-Only DTO와 유사하지만 VO는 getter 기능만 존재한다 DTO와 VO 차이점 DTO는 인스턴스 개념이고 VO는 리터럴 값 개념이다. VO는 값들에 대해 Read-Only를 보장해줘야 존재의 신뢰성이 확보되지만 DTO의 경우는 단지 데이터를 담는 그릇의 역할일 뿐 값은 그저 ..

Springboot 2023.07.18

[Springboot] CORS란?

CORS(Cross Origin Resource Sharing): 도메인이 다른 자원에 리소스를 요청할 때 접근 권한을 부여하는 메커니즘 친구의 물건을 쓰려면 친구가 제한하는 규약안에서 사용해야 하듯, 다른 도메인의 자원을 쓰려면 자원의 주인이 허락한 규약을 지켜야 하는 것이고 이러한 규약을 표준화한 것이 CORS이 여기서 말하는 도메인이란 Resource를 의미하며 프로토콜, 호스트, 포트를 의미한다. (ex. http : 프로토콜, localhost : 호스트, 8080: 포트) 프로토콜 - http와 https 도메인 - domain.com, other-domain.com 포트 번호 - 8080, 7070 위의 3개가 같아야 같은 출처이다. SOP와 CORS 📌 SOP와 CORS에 대해서 설명해주세..

Springboot 2023.07.15

[Springboot] Handler, @ExceptionHandler, @ControllerAdvice

Handler 클라이언트로부터의 요청을 처리하고, 해당 요청에 대한 적절한 작업을 수행하는 역할 @Controller와 @RestController를 사용하여 정의한다. 핸들러는 특정 URL에 매핑되고 해당 URL로 요청이 들어오면 실행된다. @ExceptionHandler @ExceptionHandler: @ExceptionHandler를 사용한 handler에서 발생하는 모든 예외를 하나의 메서드로 처리할 수 있다. 아래는 PostController에서 NullPointerException발생 시 nullex 메서드를 호출하는 코드이다. @RestController public class PostController { ... ... @ExceptionHandler(NullPointerException..

Springboot 2023.07.11

[Springboot] 관계 매핑(ORM; Object Relational Mapping) N:M

외래키의 주인은 1:N, N:1에선 1이고 N이 가지고 있는다. N:M 직접 연관을 맺으면 안된다. 가운데에 테이블을 하나 더 생성하여 테이블을 거쳐 관계를 맺어야 한다. N : 1 : M 형식이 된다 예시: 여러 메뉴(N)를 가지는 식당과 여러 손님(M) 사이의 주문(1) 중간 테이블인 Order테이블 @ManyToOne @JoinColumn(name = "user_id") private User user; @JoinColumn: 외래키를 매핑할 때 사용. 저장시 user_id라는 릴레이션(튜플)에 저장한다. users(손님) 테이블 @OneToMany(mappedBy = "user") private List orderList = new ArrayList(); mappedBy: 타겟 엔티티(Order)..

Springboot 2023.07.07

[Springboot] Security

어제 Security가 Controller보다 먼저 실행된다는 것을 알았다. 하지만 오늘 직접 코드를 구현해 봄으로써 어떻게 Controller 이전에 Security가 올 수 있는지 확실히 알지 못했기에 login 기능을 구현하는데에 어려움을 겪었다. 찾아보던 도중, 좋은 notion글이 있어서 참조했다. Spring Security 인증(Authentication): 해당 사용자가 본인이 맞는지 확인하는 과정 hyeonjunju.notion.site 클라이언트가 정보를 요청하면 AuthenticationFilter가 요청을 가로채고, 가로챈 정보를 통해 토큰을 생성한다. AuthenticationFilter 예시코드 public Authentication attemptAuthentication(Htt..

Springboot 2023.07.01

[Springboot] Filter와 Spring Security

Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다. 이때, 각 요청에 대해서 공통적으로 처리해야 할 필요가 있을 때 DispatcherServlet 이전에 단계가 필요하며 이것이 Filter다. Spring Security도 인증 및 인가를 위해 Filter를 사용하며 FilterChainProxy를 통해서 상세로직을 구현한다 Spring security에서 제공하는 인증방식: Form login Form Login 기반 인증: 인증이 필요한 URL 요청 시 인증되지 않았다면 로그인 페이지를 반환하는 구조 내부에서 인증을 처리할 때 가장 많이 사용되는 방식으로 usernamePasswordAuthenticationFilt..

Springboot 2023.06.30

[Springboot] login 구현

로그인이란 인증, 인가를 거치는 단계이다. 1. 인증(Authentication)과 인가(Authorization) 인증: 해당유저가 실제 등록된 유저인지 확인하는 단계 인가: 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 단계 하지만 보통의 웹 사이트들은 비연결성 무상태로 통신하기에 로그인을 구현하기에 어려움이 따른다. 비연결성 무상태 비연결성 무상태란 리소스 절약을 위해 클라이언트가 요청 시 연결, 처리 후 요청을 끊는 방식을 뜻한다. 클라이언트 - 서버 간 연결을 계속 유지한다면 서버 측에서 기하학적 비용이 발생할 수도 있기 때문이다. 그런데 요청을 끊으면 어떻게 로그인한 페이지가 로그아웃이 되지 않고 유지되는가? 보통 쿠키세션, JWT 방식을 이용하여 로그인을 유지한다. 쿠키세션 방식..

Springboot 2023.06.29

[Springboot] @Valid

오늘은 게시판 백엔드 구현 후, 로그인 환경을 구현했다. ID 조건 1. a ~ z와 숫자 0 ~ 9만 입력받을 것 2. 길이는 4글자 이상, 10글자 이하일 것 이었다. Service에서 Replace를 사용하여 구현했었다. 구현을 완료하고 난 후, 참고자료를 확인했는데 어노테이션으로도 손쉽게 기능을 구현할 수 있었다. 우선 gradle에 빈 검증기를 작성하여야 사용할 수 있다. implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation' Entity 코드 import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints..

Springboot 2023.06.28