오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 베이직 클래스 보충수업 / 데이터 베이스 실습
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • Entity 매핑, @어노테이션 구분

1. @Entity 

@Entity 어노테이션은 JPA를 사용해 테이블과 매핑할 클래스에 붙여주는 어노테이션이다. 이 어노테이션을 붙임으로써 JPA가 해당 클래스를 관리하게 된다.

속성 기능
name JPA에서 사용할 엔티티 이름 지정
name을 쓰지 않을 경우 (default) 클래스이름을 엔티티 이름으로 지정

아래의 코드 결과를 보면 name = "user2"로 함으로써 user2 테이블이 생성된 것을 볼 수 있다.

@Entity(name = "user2")
public class User {}

테이블 생

2. @Table

@Table은 엔티티와 매핑할 테이블을 지정

속성 기능
name 매핑할 테이블 이름
생략시 엔티티 이름(@Entity(name="~") 사용
catalog catalog 기능이 있는 DB에서 catalog 매핑
schema schema기능이 있는 DB에서 schema 매핑
uniqueContraints DDL 생성시 유니크 제약조건 생성
 스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용

아래 코드 결과를 보면 @Table에 name을 추가하면 테이블이름이 name값으로 설정이 되고 생략시 Entity이름으로 테이블이 만들어지는 것을 확인할 수 있다.

@Entity
@Table(name = "user3")
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user3 명칭으로 테이블 생성

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user2 명칭으로 테이블 생성

 

3. @Id

@Id는 특정 속성을 기본키로 설정하는 어노테이션이다.

@Entity
@Table(name = "User")
public class User {
    @Id
    private Long id;
    private String name;
}

@Id 어노테이션만 적게될 경우 기본키값을 직접 부여해줘야 한다.

하지만 보통 DB를 설계할 때는 기본키는 직접 부여하지 않고 Mysql AUTO_INCREMENT처럼 자동 부여되게끔 한다.

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

@GeneratedValue 어노테이션을 사용하면 기본값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.

전략에는 IDENEITY, SEQUENCE, TABLE 3가지가 있다.

속성 기능
@GeneratedValue(startegy = GenerationType.IDENTITY) 기본 키 생성을 DB에 위임 (Mysql)
@GeneratedValue(startegy = GenerationType.SEQUENCE) DB시퀀스를 사용해서 기본 키 할당 (ORACLE)
@GeneratedValue(startegy = GenerationType.TABLE) 키 생성 테이블 사용 (모든 DB 사용 가능)
@GeneratedValue(startegy = GenerationType.AUTO) 선택된 DB에 따라 자동으로 전략 선택

위 처럼 다양한 전략이 있는 이유는 DB마다 지원하는 방식이 다르기 때문이다.

AUTO 같은 경우DB에 따라 전략을 JPA가 자동으로 선택한다. 이로 인해 DB를 변경해도 코드를 수정할 필요 없다는 장점이 있다.

 

4. @Column

@Column은 객체 필드를 테이블 컬럼과 매핑한다.

@Column
private String name;
속성 기능
name 필드와 매핑할 테이블의 컬럼 이름 지정
default는 필드이름으로 대체
insertable true : 엔티티 저장시 필드값 저장
false : 필드값이 저장되지 않음
updatable true : 엔티티 수정시 값이 수정
false : 엔티티 수정시 값이 수정 되지 않음
table 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
nullable  null값 허용 여부 설정
false : not null 제약 조건
unique 컬럼에 유니크 제약조건 부여
columnDefinition 데이터베이스 컬럼 정보를 직접 부여
length 문자 길이 제약조건
String 타입일 때 사용
precision, scale BigDecimal 타입에서 사용
precision : 소수점을 포함한 전체 자릿수 설정
scale : 소수의 자릿수

 

 

오늘의 느낀점

오늘 베이직 수업을 들으면서 @Entity 구성에 많이 사용되는 Jpa 어노테이션을 재복습 하는 시간을 가졌다.
해당 어노테이션이 자세하게 파고 들지은 않아서 어떤 역할을 하는지  대충 알고있는 형태로만 알고 있었는데 이번 프로젝트를 하면서 어노테이션에 대해서 세부적으로 기본개념에대한 설명을 읽으면서 알아보니 좀더 잘이해가되어 앞으로도 적용하는데 도움이 될거 같다.

 

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • JetBrains IDE에서 제공하는 Code With Me

Code With Me란 IntelliJ 기반 IDE에서 기본적으로 제공하는 공동 프로그래밍 기능으로 이를 사용하면 전문 개발자가 물리적으로 서로 다른 위치에 있는 경우에도 동일한 코드 기반에서 실시간으로 원활하게 작업할수 있다.

 

 

오늘의 느낀점

오늘 프로젝트의 기본적인 Entity를 구상하기위하여 코드작성에 들어갔다.
이전 조에서는 코드짤때 각자 코드를 짠후 합치는 형식이었는데 이번에는 팀장,팀원 분들이 Code With Me 를 통해 짠후 각자 작업에 들어가자고 얘기하자 나는  Code With Me를 처음 들어서 뭔지 모르는 상태로 가만히 있었다.
잠시후 팀장인 원호님이 인텔리제이로 팀원들을 초대하여 하나의 프로젝트에 다같이 들어오게 됬고 여기서 바로 코드를 짜면 각자 똑같이 반영되며 동시에 빠르게 수정할수 있었고 덕분에 팀원들이 작성하는 코드를 바탕으로 작성후 서로 보완해주면 빠르게 마칠수 있었다.
코드 공부를 하며 지금 사용하고 있는 인텔리제이 에서 이런 기능까지 있는줄은 전혀 몰랐다.
이뿐아니라 github등 앞으로 개발자 생활하는데 있어서 도움이 되는 기능 및 프로그램에 대해 찾아봐야 겠다고 느끼게 됬다.

오늘 공부한 내용

  • Spring 심화 팀별과제 발제 / 백오피스 프로젝트
  • 프로젝트 구상 
  • 베이직반 보충수업 / 
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

- 이번 백오피스 프로젝트로 배달의민족 같은 음식배달 페이지를 만들기 위해서 들어갈 기능에대해 API를 구상하면서 추후 백오피스에 적용가능하도록 세부적으로 작성하다보니 많은 시간이 소요됨

 

새로 알게된점

  • API, ERD, 와이어프레임 등 설계에 시간이 많이걸릴지라도 정확한 구상은 프로젝트의 전체기간을 줄일수 있다.
  • @PathVariable,@RequestParam, @ModelAttribute, @RequestBody 에대한 개념
    1. @PathVariable
      • 개념 : URL 경로에 포함된 변수를 컨트롤러 메서드의 매개변수로 바인딩하는 데 사용된다.
      • 특징 : 
        • URL 경로의 일부를 변수로 사용하여, 동적으로 변하는 URL 경로를 처리할 수 있다
        • 간결하고 직관적인 API 경로를 설계할 수 있다.
    2. @RequestParam
      • 개념 : 클라이언트가 전송하는 HTTP 요청 파라미터를 컨트롤러 메서드의 매개변수로 바인딩하는데 사용
      • 특징 :
        • URL에서 지정된 이름의 파라미터를 메서드 매개변수로 전달한다.
        • 필수 여부, 기본값 설정 등의 추가적인 설정이 가능하다.
    3. @ModelAttribute
      • 개념 : 요청 파라미터를 객체로 매핑하여, 복잡한 데이터 구조를 쉽게 다루게 해준다.
      • 특징 :
        • 폼 데이터의 각 필드가 객체의 필드와 자동으로 매핑한다.
        • 복잡한 객체 구조의 데이터를 간편하게 처리한다.
    4. @RequestBody
      • 개념 : 클라이언트가 전송하는 HTTP 요청의 본문(body)을 Java 객체로 변환
      • 특징 : 
        • HTTP 요청 본문의 내용을 자바 객체로 역직렬화 한다.
        • 주로 JSON 또는 XML 형식의 데이터 처리에 사용 한다.

 

 

 

오늘의 느낀점

CRUD를 작성하면서 어느정도 따라칠수 잇었지만 정확한 구조에대해서는 잘 이해가 못가는 상태로 적고 있었다.
베이직 클래스 수업에서 알려준 어노테이션에 대한 개념을 이해하기 쉽게 알려주어서 내가 작성하는 CRUD에 어떻게 들어가는지 이제 감이 오기 시작햇다.

 

 

오늘 공부한 내용

  • Spring 심화 영상 시청
  • Spring 심화과제 테스트 해설영상 시청, 따라치기
  • 코드카타 2문제

 

어려웠던 내용

  •  테스트 안에 사용되는 코드에 대한 이해도가 낮다.

 

새로 알게된점

아스키코드 (ASCII) : 미국 ANSI(미국 국가표준 협회)에서 표준화한 정보 교환용 7비트 부호체계

  • 아스키 코드 특징
    1. 영어 알파벳을 사용하는 대표적인 문자 인코딩
    2. 컴퓨터와 통신장비를 비롯하여 문자를 많이 사용되는 장치에 사용
    3. 대부분의 문자 인코딩이 아스키코드에 기초를 두고있다.

아스키 코드 구조 표

  • 출력 가능한 문자들
    • 영문 알파벳 대 + 소문자 52개 ( 65 ~ 90, 97 ~ 122 )
    • 숫자 0 ~ 9 총 10개 ( 48 ~ 57 )
    • 특수문자 32개 ( 33 ~ 47, 58 ~ 64, 91 ~ 96, 123 ~ 126 )
    • 공백문자 1개 ( 32 )
  • 아스키 코드 사용경우

컴퓨터는 문자를 인식할수 없기 때문에 숫자만 알 수 있다. 때문에 문자 또한 숫자 형태로 인식하게 되는데 이때 아스키코드를 참조하여 숫자를 문자로 표현 할 수 있게 된다.

 

여기서 문자 A의 아스키 코드값은 65이다. 그럼 65 숫자를 char형으로 출력해주면 어떻게 나올까?

public class Main {
	public static void main(String[] args) {
    	System.out.println((char)65);
	}
}

결과는 "A " 가 나오게 되며 여기서 반대로 문자인 A를 INT형으로 출력하면

public class Main {
	public static void main(String[] args) {
    	System.out.println((int)'A');
	}
}

결과는 65가 나오게 된다.

 

 

오늘의 느낀점

 

코드카다 문제에서 일정 코드를 작성시 집합 안에 문자열로 숫자와 글자가 들어있는 경우 false, 숫자만 들어있는 경우 true 로 증명하라는 형태의 문제가 있었는데 작성중 답변을 구하기위해 문자를 숫자형으로 숫자형을 다시 문자형으로 바뀌기 위해 코드를 짜다보니 오히려 어지럽고 작성이 잘안됬었다.

그러던중 숫자로 문자를 나타내는 아스키코드를 알게되었고 이를 이용하니 좀더 편안하게 코드를 짤수 있게 되었다.

컴퓨터는 복잡한 일을 할수 있을것 같지만 세심히 들여다보변 복잡한 일을 하기보다는 정해진 규칙대로 반복적인 일을 수행할뿐이며 결국 사람이 코드를 짜주어야 다양한 일을 할수 있겠다라고 느끼게 됬다.

오늘 공부한 내용

  • Spring 심화 영상 시청
  • Spring 심화과제 테스트 작성
  • 코드카타 2문제

 

어려웠던 내용

  •  개념은 이해했는데 응용이 어렵다...

 

새로 알게된점

테스트 코드 ( 단위테스트, 통합테스트)

테스트코드를 작성 하는 이유

- 테스트란 의도된 대로 정확히 작동하는지 검증하는 절차이며 코드 수정시 예상치 못한 부작용을 방지할수 있다.

단위 테스트 : 소스 코드의 개별 단위로 한가지의 기능 테스트 하는 방법

  • 장점 
    1. 프로그램의 각 부분별로 테스트 하여 개별부분을 올바른지 확인하여 문제점을 찾기 쉽다
    2. 코드변경시, 변경한 부분으로 인한 영향도를 쉽게 파악가능 하다
  • 단점
    1. 일정 기능대한 작동하는 코드로 외부 종속성과 올바르게 작동하는지 확인알수 없다.

 

통합합 테스트 : 단일 테스트가 끝난 코드들을 통합하는 과정중 생길수 있는 오류를 찾는 테스트 방법

  • 장점 
    1. 코드가 외부 종속성에 어울리는지에 대해 전체 시스템을 구축할 때 오류를 감지할수 있다.
  • 단점
    1. 어느부분이 문제인지 오류를 찾는 것이 어렵다.
    2. 복잡성이 증가하여 시간이 오래 걸릴 수 있으며 유지,관리에도 어려움을 느낄수 잇다.

 

오늘의 느낀점

 

어차피 코드 돌리면 문제가 발생한 지점에 대해 오류 뜰텐데 굳이 왜 테스트 코드까지 돌려야 하나 라고 생각했지만 듀터님의 말씀으로 테스트 코드가 기록되어 있을시 현업에서 일할시 발생되는 문제점에 대해 즉각적인 대응을 할수 있다는 것에 대해 알게됬다.

확실히 어떤 업무는 기준을 정해놓고 작업을 실시하면 흐트려지지 않고 내가 가고자 하는 방향을 갈수 있으며 추후 문제점 발생시 당황하지 않고 처리가 가능하기 때문에 작성을 해두면 큰도움이 될것이라 고 느끼게 됬다.

다만 테스트 코드 만드는것도 나름 일이라서 어려운게 문제다 ㅠㅠ

 

오늘 공부한 내용

  • Spring 심화주차 영상 시청
  • 코드카타 2문제
  • 베이직반 보충수업 / 디스패처 서블릿, CSR, SSR

 

어려웠던 내용

  • 개인 과제 / 테스트 코드 구현
    • 약 2시간 가량 작성하며 고민했으나 진도가 나가지 않음... 테스트코드 자체에 대한 공부 필요

 

새로 알게된점

  • DispatcherServlet

디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있다.

그리고 이러한 단어를 포함하는 디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있습니다.

 

  • 디스패처의 장점

과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 편리하게 사용가능 합니다.

 

  • 디스패처 서블릿의 흐름

  1. 처음 클라이언트에서 요청이 오면 디스패처 서블릿이 해당 요청을 받는다.
  2. Handler Mapping을 통해 요청에 알맞은 컨트롤러를 찾아낸다.
  3. 찾아낸 컨트롤러를 Handler Adapter를 통해 해당 컨트롤러의 메서드를 실행시킨다.
  4. 컨트롤러는 요청을 처리한 뒤 처리한 결과와 해당 뷰 정보(ModelAndView)를 다시 디스패처 서블릿에게 전달한다.
  5. 받은 정보로 디스패처 서블릿은 View Resolver를 통해 View 파일을 찾는다.

 

  • CSR ( Client Side Rendering )

SSR과 달리 렌더링이 클라이언트 쪽에서 일어나는 형식, 서버는 요청을 받으면 클라이언트에 HTML과 JS를 보내준다. 클라이언트는 그것을 받아 렌더링을 시작한다.

  1. 기본적인 HTML구조를 받고 JavaScript가 실행되면서 필요한 데이터를 불러와 화면을 작성.
  2. 서버에 부하가 적습니다.
  3. 네트워크를 많이 사용하기 때문에  첫 진입 시 로딩 속도가 길다.
  4. HTML 파일을 하나만 받아와서 작동하다 보니 각각 페이지에 대한 정보를 담기 힘들어 SEO에 취약.

 

  • SSR ( Server Side Rendering )

서버쪽에서 렌더링 준비를 끝마친 상태로 클라이언트에 전달하는 방식

  1. 모든 HTML을 받아서 렌더링만 하면 됩니다.
  2. 서버에 부하가 많이 갑니다.
  3. 완성된 페이지를 빠르게 볼 수 있습니다.
  4. 초기 진입은 CSR보다 빠를지 몰라도 페이지 이동은 SSR이 더 느린 편에 속함.
  5. Javascript 다운로드가 늦어진다면 기능이 동작하지 않는 경우가 있음.

 

오늘의 느낀점

박성원 튜더님의 보충강의는 정말 이해가 잘간다.

영상을 보면서 의문을 가지거나 혹은 이해가지 않는 개념을 하나하나 세세히 알려주면서 이해를 도와주기 때문에 필수적으로 들으면서 복습에도 좋은 공부가 된다.

오늘 공부한 내용

  • Spring 숙련주차 2주차 영상 완강
  • 코드카타 2문제
  •  

 

어려웠던 내용

  • 회원별 상품 API구현

 

새로 알게된점

  • Scheduler 기능 구현

스케줄러 기능은 주기적으로 정보를 업데이트 하는 기능이다.

주로 다른 곳에서 가져와서 저장한 정보를 일정시간마다 업데이트 하여 최신정보를 유지하기 위한 목적으로 쓰인다.

@EnableScheduling // 스프링 부트에서 스케줄러가 작동하게 합니다.
@EnableJpaAuditing // 시간 자동 변경이 가능하도록 합니다.
@SpringBootApplication
public class MyselectshopApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyselectshopApplication.class, args);
    }

}

Spring boot에는 스케줄러 기능을 지원하며 위 코드 처럼 기본적으로 프로젝트 Application 안에 @EnableScheduling 어노테이션을 사용하면 기능 활성화를 할 수 있다.

 

package com.sparta.myselectshop.scheduler;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class AcadScheduler {
  private static final Logger logger = LoggerFactory.getLogger(AcadScheduler.class);
  
  @Autowired
  private AcademyMapper academyMapper;
  
  // 매주 토요일 새벽 3시에 자동으로 시작하는 스케쥴러
  @Scheduled(cron = "0 0 3 * * 6")
  public void autoUpdate() throws Exception {
    logger.info(new Date() + "스케쥴러 실행");
  }

이후 클래스 파일에 컴포넌트를 달아주면 스케쥴러를 사용할 수 있다. DB를 연동하고 싶다면 Autowired로 service나 mapper를 연결해주면 된다. 나는 mapper를 이용했다.

 

또한 스케줄러의 갱신주기를 조절 할 수있는데 @Scheduled의 ()안에 cron이란 표현식을 사용하여 적용가능하다.

이를 크론 표현식이라고 하는데 이는 '필드허용되는 값허용되는 특수문자' 를 뜻하며 밑에 표처럼 문자별 값을 가진다.

 

Cron 표현식 - 특수문자,

* : 모든 값을 뜻합니다.

? : 특정한 값이 없음을 뜻합니다

- : 범위를 뜻합니다. (예) 월요일에서 수요일까지는 MON-WED로 표현

, : 특별한 값일 때만 동작 (예) 월,수,금 MON,WED,FRI

/ : 시작시간 / 단위  (예) 0분부터 매 5분 0/5

L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)

W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음 

# : 몇째주의 무슨 요일을 표현 (예) 3#2 : 2번째주 수요일

 

Cron 표현식 작성시 예시 모습

 

 

오늘의 느낀점

확실히 이전보다는 API 작성과 JWT에 대한 코드 구조가 이해가 된다.

전 강의 시청때는 코드를 따라 치면서도 이게 뭔지 왜 나오는지 전혀 모르는 상태로 쳤었든데 지금은 그래도 작성중 이 매개변수가 와야 하는구나 정도로 구분이 점점 되고 있다.

그래도 희망이 조금 보이는 구나 ㅎㅎ

 

 

오늘 공부한 내용

  • Spring 숙련주차 2주차 영상 시청
  • 코드카타 2문제
  •  

 

어려웠던 내용

  • Filter 적용 / 아직 필터에 대한 정확한 개념을 못잡고 있다.

 

새로 알게된점

  • Naver Open API

네이버의 Open API는 '네이버 개발자센터 NAVER Developers'에서 확인 할수 있으며 네이버플랫폼의 기능을 외부 개발자가 쉽게 이용할 수 있게 웹 또는 SDK 형태로 공개한 기술들을 말한다.

 

위 내용은 네이버 에서 현재 제공하고 있는 오픈 API 목록이며 API에 따라 일정 횟수에 따른 호출제한이 걸려 있기도 하고, 서비스 이용 약관에 따라 제한되는 부분도 존재한다. 따라서 네이버 오픈 API를 활용해 서비스를 개발하고자 할 경우에는 홈페이지를 자세히 확인해야 한다.

 

위와 같은 오픈 API들은 크게 네가지 카테고리로 분류된다.

네이버가 개발 및 서비스 하고 있는 인공지능 플랫폼 CLOVA, 네이버가 아닌 다른 서비스에서 네이버의 사용자 인증 기능을 이용할 수 있게 하는 서비스 네이버 로그인, 다국어 언어 처리에 대한 네이버의 기술과 경험을 적용해 보다 정확한 번역 결과를 제공하는 파파고, 그 밖의 서비스 API 로 구분한다.

오늘의 느낀점

 오늘 스프링 심화주차에 들어가게 된다.

먼저 심화주차 과제 발제를 알려주셨는데 차후 개발자가 되기 위해서 스스로 코드 작성시 문제점을 알기위해서 테스트 작업에 익숙해져야 한다는 의의 하게 진행 하게 된거 같다.

다만 과제내용이 기존에 작성한 과제물에 Controller, Service, Repository, Entity, DTO 레이어에 맞는 단위 테스트 작성하기 이다 보니 나는 이전과제를 완성하지 못해서 완성을 한후 시행해야 할거같다.

 

 

 

 

프로젝트

  • 팀명 : 밥사조
  • 팀원 : 김대영, 문형원(팀장), 손다희
  • 프로젝트명 : 직관메이트 게시판
  • 개발 기간 : 2023.11.21 ~ 2023.11.27
  • 개발 내용 : 뉴스피드 게시판 만들기  
    • 의도 : 카카오톡의 오픈카톡에서 특정 주제로 친목모임을 가지는 것처럼 야구를 보러갈시 혼자가 아닌 내가 원하는 경기때 각자의 사정에 부담없이 같이 보러갈 사람을 구하는 형태의 게시판 작성
  • 깃허브 : https://github.com/hyeon9won/newsfeed

1. KEEP

협업

  • 과제실행에 앞서 전체적인 구조설계 와 실현기능을 구분하기위해 API명세서 와 와이어프레임 작성
  • Git으로 수정된 파일을 바로 올려서 적용 

기술

  • 회원가입, 로그인, 로그아웃을 위한 JWT 와 Spring Security 활용
  • DateBase 로 Mysqs 을 이용
  • Spring Data JPA 이용
  • API 를 세부적으로 운용하며 테스트 하기위해 API명세서 작성 및 Postman 활용
  • 와이어프레임 작성을 위해 Figma 활용
  •  

2. PROBLEM

협업

  • Java Spring Boot의 낮은 숙련도로 기능 구현하는데 여러움을 느낌
  • 서로간의 코드작성시 변수의 혼란으로 커밋할시 혼선이 옴
  • 클래스, 패키지의 명칭 명명시 세분화 필요

기술

  • JWT 작성시 구조에대해 좀더 명확하게 세분화 필요, 작성시 가독성이 떨어져 추후 다른기능 구현에 객체 찾는데 어려움을 느낌
  • Spring Security 활용시 원하는 정보의 값을 정확하게 가져오는데 어려움을 느낌
  •  

3. TRY

협업

  • 각 담당 기능 별 코드 리뷰
  • 코드 작성시 사용하고 있는 변수 값에 대해서 공지글에 올리기
  • 클래스, 패키지의 이름 작성시 좀더 세부적으로 나누어서 작성하rl
  • 팀원 개인의 역량을 파악하는 시간을 갖기
    • 할 수 있는 것과 없는 것의 명확한 구분 필요
  • 정기 소통 시간 계획
    • 저녁 정기 미팅: 진행 현황 공유
  • 강의에서 배운 자바 스프링 부트 기초를 최대한 이용하여 제작
  • Github 사용
  • Postman 사용
  • figma 사용

기술

  • Redis 시도
    • 로그아웃이후 사용되었던 토큰의 유효성을 없애기 위하여 사용
    • 코드를 작성하면서 문제점이 발생시 어느지점에서 어떻게 잘못된것인지 잘 찾지 못함으로 JWT를 좀더 세부적이고 가독성이 편한 상태로 정리해야 하는 필요성을 느낌
  •  

4. 느낀 점

 

김대영

백엔드 에 실질적으로 사용되는 Java Spring Boot 라는 새로운 언어를 배우면서 WEB에서 데이터가 어떻게 처리되는지 에대해서 크게 이해하고 알 수 있었습니다.

다만 수업진도에 비해 낮은 이해로 많은시간과 노력을 부었음에도 과제에 실질적인 적용을 크게 하지못한것에 대해 많은 아쉬움이 남습니다.

기초를 정확하고 올바르게 쌓는데 좀더 중점으로 노력하여 앞으로 하게될 프로젝트에 보다 성취감을 느끼고 싶기에 포기 하지 않고 노력하고자 합니다.

문형원

 

 

손다희

 

 

 

 

 

 

오늘 공부한 내용

  • Spring 숙련주차 1주차 영상 재시청
  • Spring 팀별과제 / 뉴스피드 만들기
  • 코드카타 2문제

 

어려웠던 내용

  •  회원가입을 위한 JWT 구조작성

 

새로 알게된점

  • HTTP 통신의 특징 

 HTTP 통신은 다음과 같은 프로토콜 환경을 가지고 있다. 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야한다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용하게된다.

 

1. Connectionless 프로토콜 (비연결 지향)

클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식입니다.

즉 두 플랫폼 사이에는 어떠한 연결 고리도 존재하지 않고, 그 전에 이루어진 HTTP 통신에 대해서는 알 방법이 없으며

이로 인해 서버에 가해지는 부담이 많이 줄어들어 리소스 낭비를 방지할 수 있습니다.

다만, HTTP 1.1버전 부터는 keep-alive라는 커넥션을 유지하여 요청을 재사용하는 옵선이 기본값으로 설정되어 있습니다.

 

2. Stateless 프로토콜

커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있습니다.

연결이 끊어지는 순간 모든 상태 정보가 사라지게 되는 방식이다.

서버에서 첫 번째 통신에서 데이터를 주고받았다 해도, 두 번째 통신에서 이전 데이터를 유지하지 않아 보낸 요청인지 분간할 수 없기 때문에 다른행동을 할 시 모든 데이터를 다시 보내야 하는 상황이 발생하게된다.

즉, 매번 통신을 할 때마다 인증을 해야한다.

 

이러한 두 특성을 해결하여 지속적으로 페이지를 사용하기 위해서 쿠키 와 세션이 필요하다.

 

  • 쿠키 와 세션 개념

1. 쿠키(Cookie)

HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다. HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.

 

쿠키는 다음과 같이 구성 되어 있다.

  • 이름 : 쿠키를 구별하는 이름
  • 값 : 쿠키에 저장되는 값
  • 유효시간 : 큐키 유지시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 요청 경로

 

2. 세션(Session)

일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술이다. 여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다. 즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.

주로 보안에 취약한 쿠키를 보완해주는 역할을 한다.

 

세션(Session) 의 특징

사용자의 데이터를 담는 쿠키는 통신 중 탈취당하면 쉽게 개인 정보가 유출될 수 있는 쿠키와는 다르게, 세션은 서버측에 저장된 데이터를 사용할 뿐더러 유일하게 클라이언트에 저장하는 세션 ID는 탈취당하더라도 역으로 정보 확인이 불가능하다.

이와 같이 네트워크 상으로 사용자의 개인 정보가 흘러 가지 않아 쿠키보다 보안성은 높지만, 사용자의 수가 많은 대형 서비스의 경우에는 세션 정보까지 관리해야하는 서버에 부담이 갈 수 있다는 단점이 존재한다.

 

 

오늘의 느낀점

 뉴스피드 과제를 만들면서 회원가입 기능을 맡기로 했다.
강의를 들으면서 연습할때는 잘 모르고 따라 했지만 이번에 내가 직접 회원가입 기능을 작성하기위해서 코드를 치다보니 페이지에 적용하기 위해서는 쿠키 와 세션에 대해서 정확하게 이해하고 있어야 왜 쓰이고 어디서 쓰이게 될지 를 확인할 수 있었다.

 

+ Recent posts