2023.08.24.목.TIL

heeh·2023년 8월 24일

TIL

목록 보기
71/82
post-thumbnail

2023.08.24.목.TIL

  • 할 것
    • 17시까지 Comment 생성, 수정, 삭제 완성하기! +빌더 패턴?!
    • CS 2번째 강의+자료 공부
    • 기술 문제 8번

댓글 구현(수정, 삭제)

  • findAllByOrderByModifiedAtDesc findAllByOrderByModifiedAtDesc는 Spring Data JPA에서 사용되는 메서드의 이름 규칙에 따른 메서드 이름입니다. 이 메서드는 Comment 엔티티에 대한 Spring Data JPA의 JpaRepository 인터페이스에서 정의된 메서드입니다.
    • findAll: 이 메서드는 특정 조건 없이 해당 엔티티의 모든 레코드를 검색합니다.

    • By: 이 키워드는 조건을 지정할 때 사용됩니다. 즉, 어떤 속성에 대한 조건을 지정하겠다는 것을 나타냅니다.

    • OrderByModifiedAtDesc: 이 부분은 속성 이름과 정렬 방식을 나타냅니다.
      - ModifiedAt: Comment 엔티티에 있는 modifiedAt 속성을 기준으로 정렬하겠다는 것을 나타냅니다. modifiedAt은 댓글이 수정된 시간을 나타내는 속성일 것으로 추측됩니다.
      - Desc: 이 부분은 정렬 순서를 나타내며, "Desc"는 내림차순을 의미합니다. 즉, 최신 날짜 및 시간이 가장 먼저 나타납니다.

      따라서, findAllByOrderByModifiedAtDesc 메서드는 Comment 엔티티의 모든 레코드를 modifiedAt 속성을 기준으로 내림차순으로 정렬하여 검색하는 기능을 제공합니다.

댓글 수정

Service

  • 생성자를 잘 쓰지 않고 builder와 of를 쓰는데, return에서 new가 거슬린다
    // Comment 다건 조회
        @Transactional
        public CommentListResponseDto getComments() {
            List<CommentResponseDto> commentListResponseDto = commentRepository.findAllByOrderByModifiedAtDesc()
                    .stream().map(CommentResponseDto::of).collect(Collectors.toList());
            return new CommentListResponseDto(commentListResponseDto);
        }
    • 변경하기
      // Comment 다건 조회
          @Transactional
          public List<CommentResponseDto> getComments() {
              List<CommentResponseDto> commentListResponseDto = commentRepository.findAllByOrderByModifiedAtDesc()
                      .stream().map(CommentResponseDto::of).collect(Collectors.toList());
              return commentListResponseDto;
          }
    • 변경하기2
      // Comment 다건 조회
          @Transactional
          public List<CommentResponseDto> getComments() {
              List<CommentResponseDto> commentResponseDtos = commentRepository.findAllByOrderByModifiedAtDesc()
                      .stream().map(CommentResponseDto::of).collect(Collectors.toList());
              return commentResponseDtos;
          }

Controller

  • 맞춰서 변경
    // Comment 다건 조회
        @GetMapping("/comments")
        public ResponseEntity<CommentListResponseDto> getComments() {
            CommentListResponseDto commentListResponseDto = commentService.getComments();
            return ResponseEntity.ok().body(commentListResponseDto);
        }
    • 변경하기
      // Comment 다건 조회
          @GetMapping("/comments")
          public ResponseEntity<List<CommentResponseDto>> getComments() {
              List<CommentResponseDto> commentListResponseDto = commentService.getComments();
              return ResponseEntity.ok().body(commentListResponseDto);
          }
    • 변경하기2
      @GetMapping("/comments")
          public ResponseEntity<List<CommentResponseDto>> getComments() {
              List<CommentResponseDto> commentResponseDtos = commentService.getComments();
              return ResponseEntity.ok().body(commentResponseDtos);
          }
  • 댓글 삭제 완료

포스트맨 테스트

  • 포스트맨 테스트 도전! → user, post 데이터 임의로 만들어서 해봤지만 실패… 물어보기!!
    • 로그인 해야한다!
  • 로그인 실패 이유
    • Encoded password does not look like BCrypt
    • 디비에서 비밀번호가 인코딩이 안돼…
    • 해결 방법
    • 다른 프로젝트에서 인코딩 된 비밀번호 가져오기!
      → 인코딩 된 비밀번호의 원래 비밀번호를 알아야 하기 때문에 다시 가입….!!!! (다 까먹어서)
  • 로그인 정보 세팅?!
    • 로그인 정보를 쿠키에 담았으면 Cookies 확인!
    • 로그인 정보를 헤더에 담았으면 로그인 리퀘스트에서 하단 Headers를 확인하고 Authorization(key)의 value 확인하기!
      Bearer ~
      
      외부노출금지!!
    • 댓글 생성, 수정, 삭제 등… (로그인 정보 필요한 것들!) 상단 Headers의 Authorization(key)와 value 값 넣어주기!
    • Body 등 세팅 후 send하고 테스트!

기술 문제 8

💡 쿠키, 세션의 개념과 차이를 설명해보세요
  • 참고
  • 쿠키(Cookie)와 세션(Session)은 웹 개발에서 사용되는 중요한 개념으로, 사용자의 웹 경험을 개선하고 정보를 저장하는 데에 활용됩니다. 이 둘은 비슷한 목적을 가지고 있지만 작동 방식과 사용 사례에서 차이가 있습니다.

쿠키

쿠키(Cookie):

  1. 쿠키는 클라이언트(사용자의 브라우저)에 저장되는 작은 데이터 조각입니다.
  2. 주로 사용자의 로그인 정보, 선호 설정, 장바구니 등을 저장하기 위해 사용됩니다.
  3. 서버에서 응답으로 클라이언트로 전송되어 브라우저에 저장되며, 이후 해당 도메인에 대한 모든 요청에서 함께 전송됩니다.
  4. 만료 기간을 설정할 수 있으며, 만료 기간이 없는 경우 세션 쿠키로 간주되어 브라우저 종료 시 삭제됩니다.
  5. 보안에 취약할 수 있으며, 중요한 정보를 저장할 때는 적절한 암호화와 보안 조치가 필요합니다.

세션

세션(Session):

  1. 세션은 서버 측에서 사용자의 정보를 저장하고 관리하는 방식입니다.
  2. 사용자가 웹사이트에 접속하면 서버는 해당 사용자에 대한 고유한 세션을 생성하고, 클라이언트에 세션 식별자를 쿠키로 보내어 저장합니다.
  3. 세션에는 클라이언트의 정보가 서버에 저장되며, 서버에서 필요한 정보를 읽고 쓸 수 있습니다.
  4. 일반적으로 브라우저 종료 시 세션 데이터는 삭제되지만, 서버 측에서 설정한 시간 동안 유지될 수도 있습니다.
  5. 상대적으로 보안성이 높지만, 서버 자원을 더 많이 사용할 수 있습니다.

쿠키와 세션의 차이점

쿠키와 세션의 차이점:

  1. 저장 위치: 쿠키는 클라이언트에 저장되고, 세션은 서버에 저장됩니다.
  2. 데이터 저장: 쿠키는 작은 양의 데이터만 저장할 수 있고, 세션은 더 많은 데이터를 저장할 수 있습니다.
  3. 보안성: 세션은 서버 측에서 데이터를 관리하므로 보안성이 더 높습니다. 쿠키는 보안에 취약할 수 있습니다.
  4. 수명: 쿠키는 만료 기간을 설정할 수 있고, 세션은 일반적으로 브라우저 종료 시 삭제됩니다.
  5. 자원 사용: 세션은 서버 자원을 더 사용하게 됩니다.

웹 개발에서는 쿠키와 세션을 조합하여 사용자 경험을 최적화하고 필요한 정보를 안전하게 관리하는 데 활용합니다.

더 자세한 차이점

1. 데이터 저장 위치:

  • 쿠키(Cookie): 쿠키는 클라이언트 측에 저장됩니다. 웹 브라우저 내부에 작은 텍스트 파일 형태로 저장되어서 웹사이트 간에 데이터 교환에 사용됩니다.
  • 세션(Session): 세션은 서버 측에 저장됩니다. 서버 내에서 데이터를 관리하며, 클라이언트는 세션 식별자를 통해 서버에 저장된 데이터에 접근할 수 있습니다.

2. 데이터 용량:

  • 쿠키: 쿠키는 작은 용량의 데이터만 저장할 수 있습니다. 보통 몇 KB 내외의 작은 데이터를 저장합니다.
  • 세션: 세션은 쿠키보다 훨씬 더 많은 데이터를 저장할 수 있습니다. 따라서 대용량 데이터를 처리하는 데 유용합니다.

3. 데이터 보안:

  • 쿠키: 쿠키는 클라이언트에 저장되므로 보안에 취약할 수 있습니다. 중요한 정보를 저장할 때는 적절한 암호화가 필요합니다.
  • 세션: 세션은 서버 측에서 데이터를 관리하므로 보안성이 더 높습니다. 클라이언트가 데이터에 직접 접근하지 않기 때문에 정보 누출의 위험이 줄어듭니다.

4. 수명과 만료:

  • 쿠키: 쿠키는 만료 기간을 설정할 수 있습니다. 만료일이 지나면 삭제되거나 더 이상 유효하지 않게 됩니다. 또한 영구적인 쿠키도 생성할 수 있습니다.
  • 세션: 세션은 일반적으로 브라우저 세션이 종료되면 삭제됩니다. 사용자가 웹 브라우저를 닫거나 로그아웃할 때 세션 데이터가 지워집니다.

5. 자원 사용:

  • 쿠키: 클라이언트 측에 저장되기 때문에 서버 자원을 사용하지 않습니다.
  • 세션: 서버 측에 저장되므로 서버 자원을 사용합니다. 따라서 동시에 많은 세션이 발생할 경우 서버 부하가 늘어날 수 있습니다.

요약하면, 쿠키는 작은 데이터를 클라이언트에 저장하는 반면 세션은 더 많은 데이터를 서버에 저장하여 보안성과 용량 면에서 더 강력한 해결책을 제공합니다.

예제 (쿠키 : 사용자 로그인) (세션 : 장바구니)

쿠키의 예제:
가상의 웹 사이트에서 로그인 상태를 유지하기 위해 쿠키를 사용하는 예제를 생각해보겠습니다. 사용자가 로그인할 때, 서버는 로그인 정보를 확인하고 클라이언트에 쿠키를 설정하여 로그인 상태를 기억합니다.

plaintextCopy code
// 서버 응답
Set-Cookie: user_id=12345; expires=Wed, 24-Aug-2023 23:59:59 GMT; path=/

// 클라이언트 요청
GET /dashboard HTTP/1.1
Cookie: user_id=12345

위 예제에서, 서버가 user_id라는 쿠키를 설정하여 사용자를 식별합니다. 쿠키는 클라이언트에 저장되며, 만료 기한까지 유지됩니다. 클라이언트가 다시 서버에 요청을 보낼 때, 쿠키가 함께 전송되어 로그인 상태를 유지합니다.

세션의 예제:
웹 사이트에서 쇼핑 카트를 관리하기 위해 세션을 사용하는 예제를 살펴보겠습니다. 사용자가 상품을 카트에 추가할 때, 서버는 해당 사용자의 세션에 선택한 상품을 저장합니다.

pythonCopy code
# 서버에서의 세션 관리 (파이썬 예시)
from flask import Flask, session, request

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/add_to_cart', methods=['POST'])
def add_to_cart():
    product_id = request.form['product_id']
    if 'cart' not in session:
        session['cart'] = []
    session['cart'].append(product_id)
    return 'Product added to cart!'

@app.route('/cart')
def view_cart():
    if 'cart' in session:
        cart_items = session['cart']
        return f'Your cart: {cart_items}'
    else:
        return 'Your cart is empty.'

if __name__ == '__main__':
    app.run()

위 예제에서, 사용자의 카트 정보는 서버의 세션에 저장됩니다. 사용자가 상품을 추가하면 세션 데이터에 반영되며, 세션은 서버 측에서 관리되므로 보안성이 높아집니다.

  • 쿠키와 세션은 웹 개발에서 사용되는 데이터 저장 방식입니다. 쿠키는 클라이언트에 데이터를 저장하기 때문에 작은 용량만 허용되며 보안에 취약할 수 있습니다. 세션은 서버에 데이터를 저장하여 브라우저 세션이 유지되는 동안 정보를 보관합니다. 세션은 쿠키보다 더 많은 데이터를 저장하고 보안성이 높지만, 서버 자원을 사용함에 따라 동시에 많은 세션이 발생할 경우 서버 부하가 일어날 수 있습니다.
  • 배움! 피드백!
    • 단점보단 장점, 응용을 중점으로 서술하기!
    • 쿠키를 지웠다고 생각해도 기록 등이 남아 있을 수 있다 = 해커들이 해킹할 수 있다… 탈취가 쉽다!
      → 쿠키의 단점을 보안하기 위해 레디스, 블랙리스트!
      → 레디스… 쿠키를 삭제하는 것 보다 쿠키를 못 쓰게 만들어버리는!
    • 블랙리스트 : 똑같은 정보가 담긴 쿠키로 로그인 할 수 없게…
      → 레디스, 인메모리에 잠깐 담아주고 처리를 하는 것!
    • SecurtyWebConfig
      • 쿠키나 세션에서 발생할 수 있는 문제를 <시큐리티필터체인>에서 설정해준 CSRF(해킹 공격 관련)으로 보안 할 수 있다!
      • CSRF 외에도 많은 보안 방법이 있다
  • 테스트 코드, CS 문제 2 해야 함!!!

오브

  • ResponseDto - of를 써준다
  • 컨트롤러, 서비스, 레포지토리 순서로 진행됨!
  • 과정 속에서 엔티티를 직접 반환하면 안됨!
    → 디비와 직접적으로 연결 됐기 때문에 함부로 반환, 노출되면 안됨! 순환참조오류!
  • 요청 받기 : Request
  • 대답 : Response
  • JPA : Repository를 의미!
  • JPA는 Entity로 받고 Entity로 반환한다!
    • 하지만 바로 Entity로 반환할 수 없기 때문에 Dto…같은 애들이 있는 것!
  • 생성자 대신 public static CommentResponseDto of(Comment comment)!!!
    @Getter
    @Setter
    @Builder
    public class CommentResponseDto extends ApiResponseDto {
        private Long id;
        private String content;
        private String username;
        private LocalDateTime createdAt;
        private LocalDateTime modifiedAt;
    
        public static CommentResponseDto of(Comment comment) {
            return CommentResponseDto.builder()
                    .id(comment.getId())
                    .content(comment.getContent())
                    .username(comment.getAuthor().getUsername())
                    .createdAt(comment.getCreatedAt())
                    .modifiedAt(comment.getModifiedAt())
                    .build();
        }
    }
    • 생성자가 나오면 안된다!!
  • extends ApiResponseDto 를 해주는 이유
    • Controller에서 ApiResponseDto가 담고 있는 것을 상세히 보여줄 수 없어서 좀 더 꼼꼼하게 작업하기 위해 써주신듯…?!

빌더 패턴

  • RequestDto - toEntity(빌더 패턴)를 써준다
  • CommentService에서 바로 빌더 패턴을 해주는 것보다 commentRequestDto에 toEntity를 만들어서 사용해주는 것이 좋다
    • toEntity() : requestDto -> Entity
    • requestDto에서 Entity를 가져오기 위해 toEntity라는 함수를 만들어서 가져오라고!
@Getter
@Builder
public class CommentRequestDto {
    private String content;

    public Comment toEntity(Post post, User user) {
        Comment comment = Comment.builder()
                .content(this.content)
                .post(post)
                .author(user)
                .build();
        return comment;
    }
  • public CommentResponseDto createComment (Long postId, User user, CommentRequestDto commentRequestDto)
    Comment comment = commentRequestDto.toEntity(post, user);

CS 문제 2

💡 CPU 와 메모리 심화
  • 질문 : 메모리 할당 종류는?
    • 답변 : 연속할당과 불연속할당이 있습니다.
    • 꼬리질문 : 연속할당에 대하여 설명하세요.
      • 답변 : 연속할당은 메모리에 연속적으로 공간을 할당하는 것을 말하며 메모리를 미리 나누어 관리하는 방식인 “고정 분할 방식”과 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용하는 방식인 “가변 분할 방식”으로 나뉩니다. 또한 “고정 분할 방식”의 한계는 내부 단편화 발생하고 “가변 분할 방식”의 한계는 내부 단편화 발생하지 않고 외부 단편화 발생만 하는데, 종류로 최초적합, 최적적합, 최악적합이 있기 때문입니다.
        1. 최초적합: 위에서부터 바로 보이는 공간에 바로 할당
        2. 최적적합: 가장 크기에 맞는 공간부터 채우고 나머지를 할당
        3. 최악적합: 가장 크기가 큰 공간에 부터 채우고 나머지 할당
      • 꼬리질문 : 불연속할당에 대하여 설명하세요.
        • 답변 : 불연속 할당은 운영체제에서는 여러 개의 작업을 효율적으로 수행하기 위해 사용합니다. 운영체제에서 불연속 할당을 사용하는 방법으로는 링크드 리스트(Linked List), 비트맵(Bitmap), 페이지 테이블(Page Table) 3가지가 있습니다. 단점으로는 메모리 공간이 분산되어 있기 때문에 프로세스가 불연속 공간에 할당될 경우 프로세스의 페이지 교체와 같은 작업이 더 복잡해질 수 있고 오버헤드 발생 위험이 있습니다.
profile
공부하자개발하자으쌰으쌰

0개의 댓글