오늘 배운 것

 Spring

- Jpa Entity 연관관계

단방향, 양방향 

단방향은 B(entity)가 A (entity)를 참조할 수 없으나 A 가 B 를 참조할 수 있을 때 한쪽 entity만 사용이 가능하다 하여 단방향이라 한다. A,B가 서로 참조할 수 있을 때는 양방향이다.

DB 테이블 간에는 방향이 존재하지 않는다. Join할 거리(외래 키)만 있다면 테이블 간 조회가 불가능한 경우는 없기 때문

entity간 참조 설정을 단방향으로 할지 양방향으로 할지는 참조 필요성에 대한 판단하에 설정해주면 된다.

단순하게 A entity에 B entity 필드값을 선언해주면 된다.(후에 나오겠지만 List 형식일 수도 있음 1:N 관계 등등..)

 

외래 키(연관관계)의 주인

Jpa를 사용할 때 외래 키의 주인을 설정해 주어야 한다.(by @JoinColumn annotation) 또 상대 entity는 mappedby attribute로 주인이 누구인지 명시해주어야 주인 entity의 참조가 가능하다.(양방향일 시)

외래 키의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며 주인이 아닌 entity는 외래 키를 읽을 수만 있다.

단순히 외래 키를 줌으로써 상대 entity를 조회하기 위함도 있지만 양방향 관계일 때는 더 중요성이 대두된다.

서로에 대한 외래 키가 있다고 가정했을 때 Jpa는 어떤 외래 키로 참조할 지 헷갈리기 때문

 

외래 키의 주인은 N:1 일 때 N(다수)인 쪽이 가진다. 하나의 entity(row)가 여러 entity에 대한 외래키를 가지는 건 어색하다(중복).

 

다중성

1:1, 1:N, N:1, N:M 관계 가 있다. 각각 @OneToOne, @OneToMany, @ManyToMany annotation으로 설정이 가능하다.

이 관계들은 대칭성도 가진다. 양방향이라 가정했을 때 1:1 <-> 1:1, 1:N <-> N:1, N:M <-> N:M 이기 때문에 대응하는 annotation을 설정해주면 된다.

알고리즘

- 프로그래머스 : 올바른 괄호(Level 2, 스택)

느낀 점

.

'TIL' 카테고리의 다른 글

[23.11.20]  (0) 2023.11.20
[23.11.17]  (0) 2023.11.17
[23.11.15]  (3) 2023.11.15
[23.11.14]  (2) 2023.11.14
[23.11.13]  (1) 2023.11.13

오늘 배운 것

 Spring

- RestTemplate

 RestTemplate는 Spring에서 지원하는 클래스로

외부 도메인과의 HTTP 통신을 위한 클래스이며 REST API 호출 이후 응답을 받을 때까지 기다리는 Synchronous 방식으로 운용된다.

우리의 Spring 서버에서 다른 서버로 HTTP request를 편하게 보낼 수 있다...

 

- getForEntity : 설정한 url로 Get request를 보내고 ResponseEntity 형으로 반환받는다.

- postForEntity : 객체를 설정한 url로 POST하여 새 자원을 만들고 ResponseEntity 형으로 반환받는다.

request 자리에 들어가는 Object는 HttpEntity로 캐스팅되거나 생성자 변수로 넘어간다. MessageConverter가 변환할 수 있는 자료형만이 들어가야 한다.

- exchange : RequestEntity에 설정된 request를 이행하고 ResponseEntity 형으로 반환받는다. 메소드 인자에 어떤 http Method를 사용할 건지 설정도 가능하다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

RestTemplate (Spring Framework 6.0.13 API)

postForLocation Create a new resource by POSTing the given object to the URI template, and returns the value of the Location header. This header typically indicates where the new resource is stored. URI Template variables are expanded using the given URI v

docs.spring.io

알고리즘

- 프로그래머스 : 기능개발(Level 2, 큐)

느낀 점

.

 

'TIL' 카테고리의 다른 글

[23.11.17]  (0) 2023.11.17
[23.11.16]  (0) 2023.11.16
[23.11.14]  (2) 2023.11.14
[23.11.13]  (1) 2023.11.13
[23.11.10]  (0) 2023.11.10

오늘 배운 것

Java 기초

- StringUtils

String에 대한 유용한 메소드들을 제공하는 클래스이다. null-safe한 연산을 진행해주는 점이 아주 큰 장점이다.

원본 클래스는 org.apache.commons.lang3 를 import해야하고 기능도 더 많지만 spring에서 제공해주는 (org.springframework.util.StringUtils) 만 알아보자.

아래는 공식 문서이다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StringUtils.html

 

StringUtils (Spring Framework 6.0.13 API)

hasText Check whether the given CharSequence contains actual text. More specifically, this method returns true if the CharSequence is not null, its length is greater than 0, and it contains at least one non-whitespace character. StringUtils.hasText(null) =

docs.spring.io

자주 쓰는 유용한 메소드들은

 

hasText() - 입력값이 null이거나, "" 이거나, 공백이 포함되어 있다면 false. 순수한 텍스트만이 있는 지 확인해준다.

public static boolean hasText(@Nullable CharSequence str) {
    if (str == null) {
       return false;
    }

    int strLen = str.length();
    if (strLen == 0) {
       return false;
    }

    for (int i = 0; i < strLen; i++) {
       if (!Character.isWhitespace(str.charAt(i))) {
          return true;
       }
    }
    return false;
}

 

isEmpty() - 문자열이 null이거나 "" 이면 true 반환.

public static boolean isEmpty(@Nullable Object str) {
    return (str == null || "".equals(str));
}

 

trimAllWhitespace() - 모든 공백을 삭제

startsWithIgnoreCase(a,b), endsWithIgnoreCase(a,b) - a가 b로 시작하거나 끝나는지 확인

 

hasText()가 JWT 토큰을 substring할 목적으로 사용되었을 때("Bearer "의 공백을 없애기 위함) 궁금해서 정리해보았다.

 

 

- Spring Security

흐름을 이해하는 게 중요하다. 용어들에 익숙해지자

 

Spring security가 제공하는 인증이 진행되는 filter의 이름은 UsernamePasswordAuthenticationFilter.

UsernamePasswordAuthenticationToken에 (principal(사용자 식별자. 주로userDetails), credentials(비밀번호 인데 인증 후 비움),Authorities)를 넣어주고 이를 AuthenticaitonManager에게 넘겨준다.

이 토큰이 합당하다면 이 토큰을 SecurityContext의 Authentication으로 set해준다.

 

 

알고리즘

- 프로그래머스 : 의상(Level 2, Hash)

느낀 점

처음보는 개념, 어려운 용어들이 우수수 쏟아지다 보니 구현은 커녕 이해도 힘들어지는데 파이팅해보자^^

'TIL' 카테고리의 다른 글

[23.11.16]  (0) 2023.11.16
[23.11.15]  (3) 2023.11.15
[23.11.13]  (1) 2023.11.13
[23.11.10]  (0) 2023.11.10
[23.11.09]  (0) 2023.11.09

오늘 배운 것

Spring 기초

- Enum

객체지향에서의 Enum은 C++ 에서의 단순 열거형과는 좀 다르다. Enum 자체도 하나의 객체처럼 활용이 가능하다.

public enum FoodEnum {
    FRUIT(Food.FRUIT),  
    VEGETABLE(Food.VEGETABLE);

    private final String food;

    FoodEnum(String food) {
        this.food = food;
    }

    public String getFood() {
        return this.food;
    }

    public static class Food {
        public static final String FRUIT = "APPLE";
        public static final String VEGETABLES = "CARROT";
    }
}

이런 식으로 Enum으로 선언된 객체 안에 필드값도 넣어줄 수 있다. 

FRUIT(Food.FRUIT, 3000) 이런 식으로 필드가 여러개로 설정할 수 있는데 DB 테이블과 유사한 형태로 매핑되어서 관리가 편한다고 한다...

 

아직 완벽하게 이해는 못했지만 유명한 이동욱 님의 글이다..

https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com

 

- Filter

 

 

Request가 Servlet에 들어오기 전, Response가 client에게 보내지기 전. 최전방과 최후방을 수호하는 전사  filter. 

java에서 지원하는 Servlet 패키지의 Filter 인터페이스를 구현하여 사용할 수 있다.

filter는 여러 개가 filter chain으로 묶여있는 형태이며 이 순서는 @Order(몇번째 순서니?) annotation을 통해 사용이 가능하다.

filter의 용도는 주로 서비스 로직과 분리된 인증, 로깅 처리 등에 사용되며

서비스 로직과 분리하여 관리 가능 + 보안의 경우 미리 차단 가능(보안성 + 성능 상의 이점) 으로 아주 좋다.

AOP 패러다임이 적용된 것이라고 튜터님이 말씀해주셨다.

알고리즘

- 프로그래머스 : 전화번호 목록(Level 2, Hash, 정렬), 광물캐기(Level 2, 완전탐색)

느낀 점

징동 따운! Spring 숙련 강의를 따라가고는 있는데 따라치기 -> 이러이러한 것입니다~~. 이런 느낌이라 내가 정확히 이해하고 있는지 좀 헷갈린다. 그래도 티원 결승 진출 + 알고리즘은 재밌고 좋아서 다행이다. 

'TIL' 카테고리의 다른 글

[23.11.15]  (3) 2023.11.15
[23.11.14]  (2) 2023.11.14
[23.11.10]  (0) 2023.11.10
[23.11.09]  (0) 2023.11.09
[23.11.08]  (0) 2023.11.08

Spring 기초

- JWT

JWT(JSON Web Token)은 쿠키-세션 소통방식의 대체재로서 정보를 JSON 객체를 통해 안전하게 전달한다.

추가로 secret key를 사용한 서명과 검증을 통해 유저를 인증하는 방식의 토큰이다.

JWT는 헤더, 페이로드, 서명으로 이루어져 있다.

헤더는  토큰의 타입("JWT")와 서명 알고리즘(주로 SHA256)이 포함되어 있다. 

페이로드는 사용자와 토큰 관련 정보들을 담고 있는 클레임들이 포함된다.

서명에는 서명 알고리즘으로 인코딩된 서명이 포함되어 있다.

이 세 요소들이 '.' 으로 구분되어 있으며 모두 base64url로 인코딩되어 있다.

JWT의 사용처는 권한부여 Or 정보교환

장점: 동시 접속사가 많을 때 서버 측 부하 낮춤(세션 저장소에 정보를 요청하지 않기 때문에), Client와 서버가 다른 도메인을 사용할 때

단점: 코드가 많아짐. 담는 내용이 많아질 수록 네트워크 비용 증가, Secret Key 유출 시 JWT 조작 가능.

 

알고리즘

- 프로그래머스 : H-Index (Level 2, 정렬)

'TIL' 카테고리의 다른 글

[23.11.14]  (2) 2023.11.14
[23.11.13]  (1) 2023.11.13
[23.11.09]  (0) 2023.11.09
[23.11.08]  (0) 2023.11.08
[23.11.07]  (1) 2023.11.07

Spring 기초

- AOP

모듈화된 비즈니스 로직들 중, 중복되는 공통 부분들을 여러번 쓰기 보다 이 공통 부분을 따로 모듈화 하자는 개념.

가로 영역의 공통 부분을 잘라냈다고 하여 Cross-Cutting 이라고도 불린다.

이는 핵심 로직을 추출하는 것이 아닌 핵심 로직에 포함된 부가 기능들(ex. 로깅, 인증절차 등등)을 공통으로 묶어 재사용하는 것

명확한 분리를 통해 핵심 로직에 정말 핵심이 담기게 되고 + 공통된 기능이 한 곳에서 관리되어 유지보수에 좋다.

다양한 annotation을 통해 Advice(공통 기능 로직이 정의되는 곳)를 실행시킬 시점을 설정할 수 있다.

@Before, @AfterReturning, @AfterThrowing, @After, @Around...

 

- 쿠키 vs 세션

역할: 클라이언트와 서버간의 상태(state)를 유지하기 위해 사용

저장위치: 브라우저 / 웹 서버

만료시점: 쿠키 저장 시 설정(서버에서 쿠키 제작 시) / 브라우저 종료, 로그아웃, 서버에서 설정한 유지기간 만료 시

보안: 취약(클라이언트 측에서 변형이나 탈취가 일어날 수 있음) / 서버 측이라 괜춘

알고리즘

- 프로그래머스 : 모음 사전(Level 2, 완전탐색, 중복순열)

'TIL' 카테고리의 다른 글

[23.11.13]  (1) 2023.11.13
[23.11.10]  (0) 2023.11.10
[23.11.08]  (0) 2023.11.08
[23.11.07]  (1) 2023.11.07
[23.11.06]  (0) 2023.11.06

Spring 기초

- JPA Auditing

ORM 기술(java에선 JPA)을 사용하여 도메인을 DB에 매핑해줄 때 자주 쓰이는 필드값이 존재하는데 대표적으로 생성시간, 수정시간 등이 있다. JPA에서는 이 생성시간, 수정시간을 자동으로 감시해주는 auditing 기능을 지원하는데. Entity가 생성된 시점 + Entity를 Dirty Checking한 후 update가 되는 시점을 자동으로 해당하는 테이블에 넣어준다.

@EnableJpaAuditing - auditing 활성화. 실행 클래스 (~~~application)에 넣어줘야한다.

@EntityListeners(AuditingEntityListener.class) - 해당 클래스에 auditing 기능을 포함시켜줌

@MappedSuperclass - 이 annotation이 있는 추상 클래스를 Entity 클래스가 상속받으면 추상 클래스의 멤버변수를 컬럼으로 인식.

위 세 annotation이 필수적이다.

- Query Method

메소드명만 잘 지어도 쿼리를 알아서 짜준다??

JpaRepository<Entity 클래스이름, PK 타입> 을 상속받아주면 쿼리 메소드를 사용할 수 있다.

public interface PostRepository extends JpaRepository<Post, Long> {}

findAllByOrderByModifiedAtDesc

findTop2ByName

findByNameEndingWith 등등이 있다. 자세한 건 공식 문서를....

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

 

Spring Data JPA - Reference Documentation

Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

알고리즘

- 프로그래머스 : 모음 사전(Level 2, 완전탐색, 중복순열)

느낀 점

오늘 특강에서 AOP 개념을 추상적으로 배웠다. 아 이러면 좋긴 하겠다 정도로 이해하고 나중에 구현하면서 장점을 이해해야겠구나 했었다. 그러나 갑자기 질문들에서 필터, 인터셉터 같은 개념들이 나옴 + 이 질문과 연관해서 프록시, 어드바이스 같은 개념들이 나오면서 모르는 단어들에 머리가 어질어질해졌다. 이해할 것만 이해하고 고수님들을 열심히 따라 잡아야지

'TIL' 카테고리의 다른 글

[23.11.10]  (0) 2023.11.10
[23.11.09]  (0) 2023.11.09
[23.11.07]  (1) 2023.11.07
[23.11.06]  (0) 2023.11.06
[23.11.03]  (1) 2023.11.03

Spring 기초

- Entity

Entity는 JPA가 관리해주는 객체들을 의미하며 @Entity 로 JPA가 관리할 수 있게끔 해주고, @Table, @Column으로 해당하는 DB에 매핑을 시켜주어야 한다.

- 영속성 컨텍스트(Persistence Context)

영속성이란 Entity의 영구성을 보장한다는 개념으로 영속성 컨텍스트에 저장함(EntityManager.persist(entity)) 으로서 Entity를 영속화할 수 있다.

여기서 영속성 컨텍스트란 JPA에서 객체를 효율적으로 관리하기 위한 개념으로. EntityManger가 관리해준다.

Entity의 생명주기는 비영속, 영속, 준영속, 삭제  4가지 상태가 있고 디버깅해서 이캐저캐 하면 살펴볼 수 있다.

- 영속성 컨텍스트의 기능

1. 1차 캐시 : 캐시 기능을 제공한다(DB 조회수 감소). Transaction이 끝나면 다 비워지기 때문에 한 transaction 내에서만 성능이 좋다.

2. 동일성 보장(Identity) : 1차 캐시를 통해 DB row 당 1개의 객체를 보장한다.

3. 쓰기지연 저장소(Actionqueue) : 버퍼링 기능을 제공한다. 쿼리를 보낼 시의 설정을 통해 최적화가 가능하다.

4. 변경 감지(Dirty Checking) : persist되었을 때 최초의 Entity 값을 snapshot 으로 저장하고 flush 시점에 현재 값과 snapshot을 비교한다. 변경사항이 있을 시 쓰기지연 저장소에 update 쿼리를 넣어준다.

알고리즘

- 프로그래머스 : 전력망을 둘로 나누기(Level 2, 완전탐색)

느낀 점

최근에 진행하는 알고리즘 난이도가 낮아서 그런지 스프링 개념 공부보다 알고리즘이 재미있다 ㅎ.

그래도 내가 더 모자란 스프링을 더 열심히! 숙련주차 들어가기 전에 기초 복습하면서 확실히 잡고 들어가자.

'TIL' 카테고리의 다른 글

[23.11.09]  (0) 2023.11.09
[23.11.08]  (0) 2023.11.08
[23.11.06]  (0) 2023.11.06
[23.11.03]  (1) 2023.11.03
[23.11.02]  (0) 2023.11.02

+ Recent posts