TIL

96일차(모험 5일차) - 프로젝트 틀 작성

haedal-uni 2021. 12. 17. 23:47
728x90

오전 11시  Github 

오늘부터 강의를 듣고 github에 올리기로 했다.

이전에 팀프로젝트 할 때 src와 build.gradle 말고는 필요없다고 하셔서 

.gitignore도 src와 build.gradle만 남기고 모두 gitignore에 포함시켜놨다.

 

초기 세팅에 readme와 gitignore을 만들고 내 파일을 push했더니 충돌이 일어났다.

아마 gitignore이 로컬과 원격이 달라서 충돌이 난 것 같았다.

 

그래서 원격 gitignore을 삭제하고 push했는데도 오류가 떠서

이전에 강제 push 말고 하나의 대안으로 git pull --rebase origin main 를 입력했던 것이 기억나

이를 입력하고 다시 push를 했지만 실패했고 결국 강제 push를 했다.

 

push를 했는데 branch가 (main|REBASE 1/1) 로 띄워져 있고

checkout해도 (main|REBASE 1/1) 으로 적혀있어서 없애기로 했다.

 

git rebase --abort

 

 

입력했더니 정상적으로 종료되었다.

 

 

 

다른 방법도 있다 >> https://stackoverflow.com/questions/18292578/what-does-git-masterrebase-1-1-mean-how-do-i-get-rid-of-it

 

 


오후 3시 궁금증

오늘 배운 스프링에서는 Controller에서 @RequestParam을 썼다.

이전에 자주 사용했던 @RequestBody랑 무슨 차이인지 궁금했다.

 

 

@RequestParam

@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.

@RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 한다.

 

그렇기 때문에 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해둘 수 있으며

해당 Parameter를 사용하지 않고 요청을 보낼 경우에

default로 받을 값을 defaultValue 옵션을 통해 설정할 수도 있다.

 

 

 

@RequestBody란?

@RequestBody는 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body 내용을

Java Object로 변환시켜주는 역할을 한다.


그렇기 때문에 Body가 존재하지 않는 HTTP Get 메소드에

@RequestBody를 활용하려고 한다면 에러가 발생하게 된다. 

 

@RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverte를 통해 Java 객체로 변환된다.

 

Spring은 메세지를 변환되는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고,

내부적으로 Reflection을 사용해 값을 할당하므로

@RequestBody에는 값을 주입하기 위한 생성자나 Setter가 필요 없다.

 

 

 

[ RequestBody, ModelAttribute, RequestParam ]

  • RequetParam
    • 1개의 HTTP 파라미터를 얻기 위해 사용됨
    • 필수 여부가 true이기 때문에 반드시 필요한 경우가 아니라면 required=false 설정이 필요함

 

  • RequestBody

- Json 형태로 받은 HTTP Body 데이터를 MessageConverter를 통해 변환시킴

- 값을 주입하지 않고 변환을 시키므로(엄밀히는 Reflection을 사용하여 할당),

  변수들의 생성자나 Setter함수가 없어도 정상적으로 값이 할당됨

 

  • ModelAttribute

- multipart/form-data 형태로 받은 HTTP Body 데이터와 HTTP 파라미터들을 Setter를 통해

1대1로 객체에 바인딩시킴

 

- 변환이 아닌 값을 주입시키므로, 변수들의 생성자나 Setter함수가 없으면 변수들이 저장되지 않음

 


출처: https://mangkyu.tistory.com/72 [MangKyu's Diary]

 

 


튜터님과의 Q&A

 

1개의 데이터를 보낼 때는 @RequestParam를 사용하고
@RequestParam이 여러 개 있다. → 값이 여러개를 보낸다  @ModelAttribute으로 사용한다.

라고 이해하고 있었는데 맞게 이해한걸까?

 

🅰️ : 맞다 하지만 지금은 @ModelAttribute를 사용하지 않아도 된다. 

@ModelAttribute를 안써도 dto에 매핑된다.

 

 

 


multipart/form-data 형태로 받은 HTTP Body 데이터와 HTTP 파라미터들을
Setter를 통해 1대1로 객체에 바인딩시킨다 라고 나와있는데 

이 얘기가 객체에 @Setter를 넣어야 한다는 말인건지 궁금했다. 

 

🅰️ : 그렇다 setter를 넣어야 한다. multipart/form-data 뿐만이 아니라 json 형태도 마찬가지이다.

 

setter를 넣었을 때랑 안넣었을 때 테스트를 해보는 것을 추천한다.

스프링버전이 올라가면서 조금씩 달라지는 부분이 생기는데 

해당 케이스들에 대해서 테스트를 해보시서 정리해보면 좋을 것 같다.

 

 


오후 6시 여전히 하드한 타임어택

 

요구사항

- 사용자 관리 

스프링 시큐리티를 이용하여 회원가입, 로그인 기능을 구현한다.

인증에는 JWT 토큰을 사용

 

- 포스팅 데이터 로그인한 사용자와 연동

로그인 후 포스팅한 데이터에 사용자 데이터가 추가된다.

포스팅 목록에는 글쓴이가 추가된다.

 


 

나는 JWT 토큰을 구현해본 적이 없어서 일단 내가 할 수 있는 거라도 하려고 했다.

html/css, javascript는 이 전에 파이썬에서 타임어택했던 코드를 보고 붙여넣었다. 

(이 전에 구현한 페이지와 같은 페이지로 구현하면 되는 것이었다.)

 

 

이 전에 진행한 프로젝트에서 작성한 내 코드를 참고하여 작성했는데 이 오류는 왜 뜨는 걸까 싶었다. 

 

Service에서 UserRequestDto에 빨간 줄이 쳐져있다.

 

 

 

팀프로젝트 코드에서 연결된 흐름을 보기 위해

github 링크에 아래처럼 1s 입력한 뒤 이와 비슷한 코드를 보며 어디와 연결되어 있는 것인지 확인했다.

 

 

 

 

알고보니 User 객체에 생성자를 적지 않아서 생긴 문제였다.

이것은 다른 팀원에게 여쭤보니 주로 서비스에서 POST와 PUT을 쓸 때 사용되는 것이라고 들었다.

 

    //POST와 PUT에서 사용(service)
    public User(UserRequestDto userRequestDto) {
        this.id = userRequestDto.getId();
        this.pwd = userRequestDto.getPwd();
    }

 

오류를 해결하고 최종 제출에서는

서버쪽에서 jwt 토큰을 이용하지 않고 그냥 클라이언트에서 보낸 그 값을 db에 저장하기만 했다.

 

 

타임어택 제출 후 요구사항대로 하려면 어떻게 해야하는지 그 흐름에 대해서

이미 팀 프로젝트로 구현한 경험이 있는 다른 팀에게 물어봤다.

 

한번 로그인하면 클라이언트가 그 값을 서버에 보내고

검증을 과정을 거치고 토큰을 만들어서 

서버가 response 값서버에서 로컬 스토리지에 저장을 하고 

클라이언트가 로컬 스토리지에서 꺼내서 id, pw 맞는지 헤더로 서버에 보낸다.

 

왜 로컬 스토리지에 저장을 하는걸까? 보안의 위험이 있지 않을까? 했는데

토큰에 회원정보가 있어서 토큰을 검증하는 과정이 있다고 했다.

 

이것을 시큐리티의 필터에서 확인한다.

 

 

 

spring시큐리티가 세션방식인데 -> jwt방식으로 사용 

클라이언트단에서는 그냥 값을 보내주고 서버에서 저장하고 확인하는 과정을 다 거친다.  

(서버쪽에서 jwt 토큰을 발급해주고 검증까지 다 함 )

 

토큰 키는 서버에서 저장 (application.properties에서 확인 가능)

만약 토큰 키가 변경되면 사용자는 다시 로그인을 하면 된다고 했다.

 

토큰 키에 유효시간을 정해두고 로컬 스토리지에서는 삭제하지 않았다고 한다.

그러면 로그인이 계속 되는거 아닌가 했는데

로컬 스토리지에서 삭제하지 않아도 토큰자체가 만료되어 유효하지 않기 때문에

로그인을 다시 해야한다고 했다.

 

 

 

beforesend -> ajax에서 header로 보낸다.

 

 

클라이언트에서 보낸 값을 서버에서 userDetails로 받는다.

 

 

 

위와 같이 설명해주시면서 참고한 링크도 주셨다.

나중에 JWT토큰을 활용할 때 봐야할 것 같다.

 

 

 

 

[참고 링크] 

Spring Security - 2. Role과 권한(Privilege)

[SpringBoot] Spring Security란?

 


오후 9시 팀 계획 관련 피드백을 받기 위해 틀 작성

프로젝트 진행의 큰 틀

  1. 규칙 정하기 ( Github 관리, 브랜치 관리, 팀 활동 할 것들 )
  2. 프로젝트 뭐할지 정하기 ( 아이디어, 컨셉 ) ( GIT readme, wiki 작성 )
  3. 레이어 아키텍쳐 짜기 ( GIT wiki 작성 )
  4. 기능 정하기 ( GIT issue, wiki 작성 )
  5. ERD, API 작성 ( GIT wiki 작성 )
  6. 기능 분배 ( 한 사이클 덩어리로 분배하기 ) & 스프린트 정하기 ( GIT wiki 작성 )
  7. Front 구현 ( GIT wiki 작성, GIT 트러블 슈팅X? )
  8. Backend 구현 ( GIT wiki 작성, GIT 트러블 슈팅 작성, test 코드 작성 )
  9. 부하테스트 ( GIT wiki 작성, GIT 트러블 슈팅 작성 )
  10. 배포 구현 ( GIT 트러블 슈팅 작성 )
  11. 사용자 피드백 받기 ( 지인 활용 )

 

어제 새벽 2시에 다른 팀들은 3차 프로젝트 피드백을 받고 코드를 수정하고

테스트 코드를 작성하고 있는데 나는 강의만 듣고 있으니 불안해졌다.

 

그래서 시간을 절약할 수 있는 방법이 다음주부터 진행할 프로젝트에 대해 방향성을 제대로 잡으면

절약할 수 있지 않을까 라는 생각이 들었고 3차 프로젝트 때 팀 면담은 받았으나 

우리가 GIT을 제대로 활용했는지 피드백을 제대로 받지 못한 점이 걸려서

이전에 잘 못 했는데 그 방향대로 진행하게 될 수도 있으니 미리 잡으려고 했다.

 

* 팀 면담은 했으나 피드백을 제대로 받지 못한 이유는 아래 글을 참고하면 된다.

89일차(내가 팀 프로젝트를 그만 하려는 이유) ,  90일차(내가 팀 프로젝트를 그만 하려는 이유2)

 

그래서 새벽에 팀원과 함께 틀을 짜놓고 오늘 정리를 하게 되었다.

 

 

 

 

psycho 팀원이 오늘도 T.S.L을 적지 않았다. 이틀이 밀려있다.

주말에 한다고 했으니 일요일날 했는지 점검을 해야할 것 같다.

 

지금 내가 하는 일이 성과가 나지 않고 공부를 해도 해도 여전히 모르겠는 이 상황에서도 

한걸음 꾸준히 앞을 나아간다면 언젠가 그 걸음들이 계속 쌓여 나의 목적지에 도달하지 않을까

 

 

 

- 모험가 haedal 

 

 

728x90