Spring

- 뉴스 피드 프로젝트 1일차

취준생을 위한 뉴스 피드 프로젝트를 설계했다.

주요기능은 회원가입, 로그인 + 인증, 프로필 설정/수정, 게시글 CRUD 이다.

 

ERD

 

Wire Frame

 

 

Pull Request에 이어서 처음으로 코드 리뷰도 해봤다.

위 예시와 다르게 팀원분에게 예의를 지키는 리뷰를 하도록 하자.

리뷰를 마치고 고를 수 있는 옵션이 세가지가 있다.

comment(그냥 댓글), approval(좋네요 승인), request changes(다시 고치고 승인받으러 오세요)

request changes가 하나라도 있으면 pull request가 불가하다.

 

- @RestControllerAdvice

@ControllerAdvice 와 @ResponseBody를 합친 annotation이다.

전역의 컨트롤러나 설정한 컨트롤러 내의 exception을 모두 처리할 수 있다.

 

@RestControllerAdvice(basePackageClasses = UserController.class)
public Advisor {

    @ExceptionHandler(NullPointerException.class)
    public void exceptionHandler(Exception e){
        System.out.println(e.getMessage());
    }
    
}

 

이렇게 설정해주면 UserController에서 nullpointerException이 발생했을 때 exceptionHandler 메소드를 실행시켜준다.

 

알고리즘

- 프로그래머스 : 택배 배달과 수거하기(Level 2, 그리디)

느낀 점

새로운 협업에 들어갔는데 초반 설계부터 다들 친절하고 존중이 갖춰진 상태라 출발이 매우 좋다. 민폐끼치지 않게 열심히

'TIL' 카테고리의 다른 글

[23.11.28]  (0) 2023.11.28
[23.11.22]  (1) 2023.11.22
[23.11.20]  (0) 2023.11.20
[23.11.17]  (0) 2023.11.17
[23.11.16]  (0) 2023.11.16

 Spring

- x-www-form-urlencoded   vs  application/json

이 둘은 HTTP request 의 header에 실려 있는 content-type의 한 종류다.

HTTP request는 Reqeust Line - HTTP header - Empty Line - Message Body 이렇게 네 파트로 나누어져 있다.

이때 Message Body에 어떤 타입(텍스트, 파일 등등)이 들어갈 것인지를 header에 명시해 줄 수 있는데 Content-Type 필드에 명시해주면 된다.

 

일단 x-www-form-urlencoded는 전통적인 Content-Type으로 html의 form 태그를 통해 보내주면 이 방식이기 때문에 인기가 많았었다. key1=value1&key2=value2 이런 식으로 넘어온다.

Controller 단에서 api 매핑할 때, annotation을 생략한 경우와 @ModelAttribute를 사용한 경우에 이러한 방식으로 request data를 받는다.

 

application/json은 현재 가장 많이 쓰이는 Content-Type으로 json 형태로 데이터가 넘어온다.

 

- @JsonInclude

Json 처리에 유용한 jackson 에서 제공하는 annotation으로 json에서 원하지 않는 값들을 제외할 수 있다.

@JsonInclude(JsonInclude.Include.NON_NULL)

 

@RequestMapping("JsonInclude.Include.") //넝담~

ALWAYS - 모든 데이터 포함

NON_NULL  - null인 데이터를 제외

NON_ABSENT - null이거나 absent인 데이터 제외

NON_EMPTY - null, absent, 빈 자료구조, "" 를 제외

NON_DEFAULT - NON_EMPTY인 경우 + 기본 형이 default(int면 0 boolean이면 true)인 경우 제외

 

알고리즘

- 프로그래머스 : 배달(Level 2, 다익스트라)

느낀 점

과제 기능 구현은 다 해서 다행이지만 설계 시에 Entity 연관 관계에 대한 고민과 공부를 더 해야한다고 느꼈다. 또한 튜터님마다 프로젝트나 코드짜는 방식이 다 다르신데 이것의 장단점에 대해서도 궁금해진 하루.

'TIL' 카테고리의 다른 글

[23.11.22]  (1) 2023.11.22
[23.11.21]  (0) 2023.11.21
[23.11.17]  (0) 2023.11.17
[23.11.16]  (0) 2023.11.16
[23.11.15]  (3) 2023.11.15

오늘 배운 것

 Spring

- Paging & Sorting

JpaRepository 인터페이스의 부모 인터페이스 PagingAndSortingRepository에서는

Page<T> findAll(Pageable pageable);

이라는 페이징 + 소팅 메소드를 지원한다.

 

여기서 pageable에 여러가지 설정이 들어가는데 아래 코드를 보면 좋다.

 
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC; 
Sort sort = Sort.by(direction, sortBy);

Pageable pageable = PageRequest.of(page, size, sort);//(현재 페이지, 노출될 페이지 수, 정렬방법)
//PageRequest.of(page, size, Sort.Direction.ASC, sortBy); 로도 가능

pageable의 구현체인 PageRequest로 현재 페이지, 노출될 페이지 수, 정렬방법이 들어가고 따로 sort를 지정하지 않고

PageRequest.of(page, size, Sort.Direction.ASC, sortBy(정렬될 카테고리)) 로 해도 된다.

 

이렇게 구성한 pageable은 쿼리 메소드도 지원해서 활용하면 아주 좋다.

Page<Product> products = productRepository.findAll(pageable);

Page<Product> products = productRepository.findAllByUser(user, pageable);

 

알고리즘

- 프로그래머스 : 하노이의 탑(Level 2, 재귀)

느낀 점

.

'TIL' 카테고리의 다른 글

[23.11.21]  (0) 2023.11.21
[23.11.20]  (0) 2023.11.20
[23.11.16]  (0) 2023.11.16
[23.11.15]  (3) 2023.11.15
[23.11.14]  (2) 2023.11.14

오늘 배운 것

 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

+ Recent posts