Springboot 20

[CS] 정규화 및 반정규화

정규화: 잘못 설계된 관계형 스키마를 쪼개어 바람직한 스키마로 만들어 가는 과정 DB 논리적 설계단계에서 수행 수준이 높을수록 유연한 데이터 구축, 정확성 상승, 물리적 접근이 복잡, 조회 성능이 저하 정규화의 목적 : 단순화, 무결성, 안정성 어떠한 릴레이션이라도 DB 내에서 표현 가능 효과적인 검색 알고리즘 생성 가능 중복배제, 저장공간의 최소화 데이터 삽입 시 릴레이션을 재구성할 필요성을 줄임 정규화를 거치지 않을 시 데이터들이 불필요하게 중복되는 현상인 이상(Anomaly)이 발생할 수 있다. 삽입 이상 : 삽입 시 원하지 않은 값들도 함께 삽입되는 현상 삭제 이상 : 삭제 시 상관없는 값들도 함께 삭제되는 현상 갱신 이상 : 갱신 시 일부분만 갱신되어 정보에 모순이 생기는 현상 정규화의 원칙 스..

Springboot 2023.07.29

[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] 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

[Springboot] @PathVariable vs @RequestParam

최근에 자주 헷갈렸던 @PathVariable과 @RequestParam의 차이점을 정리했다. 🔹 @PathVariableURL 경로 자체에 값을 포함시켜 전달하는 방식.RESTful한 웹 서비스에서 자주 쓰이며, 리소스를 식별하는 데 적합하다. @GetMapping("/hello/{name}/{age}")public String helloRequestPath(@PathVariable String name, @PathVariable int age) { return String.format("Hello, @PathVariable. name = %s, age = %d", name, age);}예를 들어 /hello/robbie/30 요청 시:name = robbieage = 30👉 특정 리소스에 직..

Springboot 2023.06.23