[Project] memoong - 헤딩기록2

mynoseis3·2023년 12월 31일

practice

목록 보기
4/32
post-thumbnail

📃 12/31 로그아웃 처리

메뉴바 설정





📃 1/1

❕ 닉네임 중복 가입 방지

유저 테이블 제약조건 다시 점검쓰

username (닉네임) 컬럼에 not null 과 unique = true로 중복 닉네임 가질 수 없게 설정

테스트

중복 닉네임으로 가입을 시도하면 위배 조건에 위반 에러가 나타난다.
중복 닉네임 가입은 우선 막았는데 이걸 사용자에게 에러 페이지로 보여줄 순 없으니까
스크립트로 중복 닉네임일 경우를 알려주고 제출을 하기 전에 막을 수 있어야 한다.


뷰에서 중복 닉네임은 ajax를 사용해서 알려주는 것은 되지만
문제는 중복 닉네임일 때도 제출을 시도한다는 점이다.

시큐리티랑 스크립트의 실행 순서가 스크립트에서 설정한 로직 조건이 맞아야만
시큐리티 로그인이 발동하면 될 것 같은데
지금은 스크립트에서 제출을 막아두어도 시큐리티 로그인이 작동하고 있는 것 같다.
왜일까 ?

며칠을 빙글빙글... 도돌이표
일단 닉네임 중복 검사가 되지 않은 상태에서는 제출을 막는 것 까진 되는데

중복 닉네임이 아닌 새 닉네임을 입력하고 검사버튼을 누르고 가입을 시도해도 막힌다.

-- > 이것저것 만지다가 중복 닉네임일 땐 막히고 새 닉네임일 땐 가입이 되기까지는
갔는데 요상한 것은 이렇게 되면 중복 가입은 막았지만 이젠 어떤 경우에도 중복 검사를 하라는 메세지가 가입할 때 항상 뜬다 ^^ ....

미쳐버려 .... 무한굴레

일단 되는 것 부터 하자 꼭 해결법 찾는다 !!!!

📃 1/2

  • admin 롤 테스트

❕ 로그인 스크립트 알림창 안 뜨는 이유 해결

이젠 스크립트 알림창은 뜨지만 id와 비번이 일치하지 않을 때 비밀번호가 틀리다라는
알림을 띄우려면 컨틀롤에서 작성해주고 뷰로 메세지를 넘겨주면 된다고 생각했는데
거기서 막혔다.
알림창에 비번일치여부 메세지를 띄울 수 있게 하는 것도 계속 수정해봤지만 알림창으로 뜨지 않고 다음 페이지로 넘어가서 컨트롤에서 설정한 메세지가 나타나는 식으로 되고 있다. 사용자 입장에서 알림창으로 띄워주는 게 훨씬 나으니 꼭 고칠 줄 알아야 한다요 !!!



📃 1/3

❕ 유저 테이블과 메모 테이블 연결 오류

  • 메모 테이블 재설정

수정 전

수정 후

로그인 후 메모를 작성하고 저장하면
로그인한 유저의 정보가 메모 테이블에 연결되어 저장되는 걸 상상했는데
며칠째 해결 못한 부분이 유저 정보에 계속 해서 null 이 뜨는 것이다...

근데 분명 메모 페이지로 접근이 됐다는 건 로그인에 성공했기 때문에 들어올 수 있었던 걸텐데
왜 ... 유저 정보에 null이 찍히는 지 모르겠다.
계속 여러가지로 찾아보면서 시도해봐도 전부 null이였다.


PrincipalDetailsService 클래스에서 username과 , userEntity 값을 확인해보면

여기서는 로그인한 유저의 정보가 담겨 있는 게 확인된다.

그렇다면
왜 memo와 관련된 기능에서는 로그인한 유저의 정보를 null로 담는걸까 ?

물어볼 사람도 없고 혼자 공부하니까 더 헷갈리고 방법을 모르겠다.

근데 꼭 해결해보고싶다. 이것도 못해결하면 내가 나아갈 수 없을 것 같은 느낌이다.

찾자 방법을 !

📃 1/4

  • 메모 테이블에서 외래키 설정 변경

  • 유저 테이블에서 memo 엔티티 연관관계 설정 추가

  • 테스트 - > 401 에러

  • 원인 : LAZY 설정

  • 메모/유저 연관관계 설정 수정

  • 테스트 - > 오류 해결 / 로그인 후 memolist 페이지로 이동 가능

계속 헤매는 부분 !!!

  • 로그인한 유저가 메모를 작성하거나 저장하려고 시도하면 로그인한 유저의 정보를 가져와서 메모가 저장될 때 메모테이블에 작성한 유저의 키가 연결되어 유저 본인이 쓴 메모들만 리스트에 나타나게 해주고 싶은데
    며칠째 유저 정보에 null이 들어가고 있다.
    gpt랑 구글에서 나와 같은 문제를 찾아 보고 여러 시도를 해봤지만 전부 해결되지 않았다.

가장 마지막에 시도해본 방법이 CustomAuthenticationProvider 클래스를 만들어
사용자의 로그인 정보를 확인하고 검증하는 방식이었는데 이 방법으로도 null에서 벗어나진 못했다.


@AuthenticationPrincipal 어노테이션을 통해 로그인한 유저를 찾지 못하고
null이 들어가는 이유가 뭘까 ?

그리고 memo/list에 입장이 가능했다는 건 로그인이 처리됐기 때문에
접근이 가능했다는건데 ... 그럼 로그인을 한 상태는 맞는 것 같다.
음 ...

😭 아리송 해결

@AuthenticationPrincipal을 사용하지 않고 임시로 해결된 방법 !

관련해서 찾아본 정보

principal은 Spring Security에서 현재 인증된 사용자를 나타내는 용어이고
보통 Authentication 객체에서 추출할 수 있는 주요 정보 중 하나로 사용된다.
Authentication 객체는 현재 사용자의 인증 정보를 캡슐화하는데 사용되며,
principal은 이 Authentication 객체에서 사용자를 식별하는 주체를 나타낸다.
주로 사용자의 식별자 (일반적으로 사용자 이름 또는 ID)가 principal로 설정됩니다.
Spring Security에서 기본적으로 제공되는 UserDetails 구현체 중 하나인 User 클래스의 경우에는 getUsername() 메서드를 통해 사용자 이름이 principal로 반환된다.

  • principal을 추출하고 사용자 이름을 얻게 된다.
  • 수정한 코드

  • 오마이갓 ! 로그인한 유저의 정보를 드디어 ... 뭔가 얼떨떨하지만
    일단 null은 사라졌다.

혼자 헤딩하면서 도전하는 프로젝트니까 나중에 더 나은 코드로 수정하더라도
우선은 오류 없이 기능이 작동되게 하는 걸 목표로 하자 ! 🌟


📃 1/6

메모 테이블 유저연결컬럼에 null 들어가는 중

메모 저장을 시도하면 작성한 유저의 정보가 메모 테이블에 같이 저장되어야 하는데
Memo 엔터티에서 user 필드가 null인 채로 저장을 시도하고 있다.
user 필드에 대한 값이 제대로 들어가지 못하니까 생긴 문제인 것 같다.


수정하다가 해결은 됐는데 어쩌다 된 거지 ?... 정확하게 이해된 게 아니라서
수상하다 !!! 우선 성공한 코드 커밋해두기

리포지토리로 바로 연결하지 않고 service로 중간 다리 역할을 만들어 연결해 보았다.

  • controller

  • service

  • 결과

드디어 메모 저장이 될 때 유저 번호도 저장되고 있다 !!! 얏호

java.lang.StackOverflowError 에러 발생

기쁨도 잠시 테스트하려고 재실행하고 로그인 시도하니 오류가 발생했다.

처음 만나는 오류였는데 찾아 보니
재귀 호출이 무한히 반복되어 스택이 넘치는 경우 발생하는 오류라고 한다.

  • 해결 시도



구글에서 찾아보면서 시도해보았지만 스택오류가 계속해서 나타났다.
gpt에게 질문한 후 해결이 되긴 했는데 아직 내 스스로 이해가 온전히 된 게 아니라서 이 부분은 프로젝트가 1차적으로 끝난 후에
점검하면서 관련 개념들이랑 시도했던 어노테이션들을 따로 정리해두어야겠다요 !

  • 해결된 방법

java.sql.Timestamp의 toString 메서드를 사용할 때 이로 인해 MemoUser 클래스의 toString 메서드에서 Timestamp 객체를 문자열로 변환할 때 스택 오버플로우가 발생하지 않도록 Timestamp 객체를 적절하게 다루게끔 MemoUser 클래스의 toString 메서드를 수정한다.

createDate 필드의 Timestamp 객체를 문자열로 변환할 때 createDate.getTime()을 사용하여 시간을 얻고 이러한 방식을 통해 무한 재귀 호출을 피하게 된다.

  • 테스트 결과 - > 스택오류 사라짐 !!

  • 다른 유저로도 메모저장을 시도한 후 db에 들어오는 값을 확인해보면
    작성한 유저의 번호가 같이 잘 저장되고 있는 걸 확인할 수 있었다.

📃 메모 목록 구현

<테스트>

  • test01로 접속

  • test0105로 접속

  • 내용이 10글자 이상일 때 ... 추가해주기
  1. Memo 엔터티에 메모 내용을 반환하는 getter 메서드를 추가하고, 컨트롤러에서 해당 getter 메서드를 이용하여 메모 목록을 조회할 때 처리하게 한다.

  1. jsp 페이지에서는 간단한 표시 로직만을 관리

이렇게 하면 실제 로직은 엔터티에 있기 때문에 코드의 일관성이 유지될 수 있다.
전에 수업에서 리스트에 10글자 이상일 때의 처리를 jsp에서만 작성했었는데
이렇게 엔티티에서 설정할 수 있는 방법도 있다는 걸 알게 됐다.

  • 결과 화면

📃 메모 수정 테스트

  • 결과



📃 추가적으로 보완할 점

  • 메모 상세 내용 확인 - > 모달창 활용 고려
  • 메모 내용 줄바꿈 처리
  • 메모 리스트 보여줄 때 최신 메모순으로 내림차순 정렬 / 메모 검색 기능 추가 고려
  • 메모 리스트 추가될 때마다 유연하게 container 길이 변경되게 설정
  • ui 수정 (뷰 크기 모바일 최적화 고려 / 배치 수정 / 버튼 수정 / 버튼 hover 시 버튼 테두리 색 넣어주기 )

📃 1/7

1. 내용 줄바꿈 처리

2. 메모 리스트 최신 메모순으로 내림차순 정렬

3. 메모 내용보기 + 작성한 시간(날짜 형식 변환)

-- > 날짜 형식 시간:분까지만 나오게 수정하기 !

++ 수정한 시간으로 변경되게 적용


4. container 크기 유동적으로 변경

  • 수정 전

  • 수정 후


ui 수정

+++

memoContent 에서 목록 버튼 컨테이너 내에서 하단 위치 고정 하는 거 알아보기
메모 많아질 때 컨테이너 위에 짤리는 거 해결 필요
css 공통 부분 정리 / 따로 나누는 부분들 각자 나누고 중복 코드 삭제


++ 추가 발견한 문제 : 로그인 쪽 또 .. 요상함 . 로그인 할 때 비번 일치하는지 여부 왜 판단 안 하니 ?.... 왜 다른 비번으로 입력해도 로그인이 되고 있지요 ? ..
++ 가입시 중복검사 버튼 눌렀을 때 / 중복 아이디 체크 문장 안 나오는 거
회원 기능 수정 / 회원 정보수정 구현과 배포에 대해선 다음 글에서 이어 작성하자 !

profile
웹개발자 꿈나무 꾸준함의 힘을 믿습니다 🚶

0개의 댓글