Giter VIP home page Giter VIP logo

miniproject_hanhae66's Introduction

miniproject_hanhae66

항해66

개발 기간: 2023.05.04 ~ 2023.05.11

🎥 시연영상 https://www.youtube.com/watch?v=mGZ9BXAWmiE

🖐항해66 블라인드 게시판

  • 항해가 66일 남은 날 프로젝트를 시작하였고, 항해의 뒷 모습 이란 생각에 항해 66으로 이름을 지었다.
  • 항해66은 항해를 하는 사람들의 익명 게시판이다. Blind를 벤치 마킹 하였다.
  • 유저의 아이디의 첫 글자, 주특기, 기수만 공개된다 ex) u***** (Spring) 14기

📃 S.A

https://www.notion.so/S-A-afa6ceba07db4022bebde44ccb35807a

📜와이어 프레임

스크린샷 2023-05-11 014246

📰 ERD

hh66 ERD

📖 API 명세서

펼쳐보기 hh66 API 명세서

👨‍👩‍👧팀원

이름 역할
이현규(BE팀장)
@OliveLover
- 댓글 API
- 게시글, 댓글 좋아요 API
- 서버 배포
- 검색 기능
- DB 연동
정성윤
@kanteluv
- RefreshToken, AccessToken
- 유저 API
- entity 연관관계
김종범
@JayB202
-게시글 API
- 검색 기능
한승희
@seunghee58
- 댓글 API
- 게시글, 댓글 좋아요 API
- 검색 기능

FE git hub : https://github.com/HaeJinS2/MiniProject_Hanghae66_FE

⚙️ Tech Stack




1️⃣ 회원 관련 기능

  1. 회원 가입 API
    - userId : 크기 4 이상, 10 이하 / 소문자와 숫자만 입력가능, 공백 금지 / 중복 불가
    - userName : 크기 10이하, 공백 금지
    - password : 크기 8 이상, 15 이하 / 대소문자, 숫자, 특수문자 가능, 공백 금지

  2. 로그인 / 로그아웃 API
    - 로그인 성공 시, Access Token과 Refresh Token을 발급하고 헤더에 토큰을 추가

  3. 마이페이지 API
    - 나의 정보 확인
    - 내가 쓴 게시글, 댓글 목록 조회

2️⃣ 게시글 관련 기능

  1. 게시글 작성 API
    - 카테코리를 선택 후 글을 작성

  2. 게시글 수정 API
    - 내가 작성한 글에 한하여 수정 가능

  3. 게시글 삭제 API
    - 내가 작성한 글에 한하여 삭제 가능

  4. 게시글 목록 조회 API
    - 게시글 목록을 내림차순으로 조회
    - 카테고리 별 게시글 조회

  5. 게시글 상세 조회 API
    - 게시글의 내용과 댓글 리스트

  6. 게시글 좋아요 API
    - 게시글에 좋아요 버튼을 눌러 좋아요 표시
    - 버튼을 한 번 더 누르면 취소

  7. 게시글 검색 API
    - 키워드를 입력하여 제목+내용, 제목, 내용으로 게시글 조회

  8. 댓글 작성 API
    - 모든 게시글에 댓글 작성 가능

  9. 댓글 좋아요 API
    - 댓글에 좋아요 버튼을 눌러 좋아요 표시 가능
    - 버튼을 한 번 더 누르면 취소

🚩 기능 구현을 위해 고민한 것

그간 항해를 진행하면서 익혀왔던 테이블간의 연관관계를 구성하고 데이터를 가져오는 방법을 개선하고 싶었는데,
서로 바라보고 있는 양방향관계에서는 순환참조가 일어날 수 밖에 없다고 생각

추천하는 방법이 @JsonIgnore, @JsonManagedReference, @JsonBackReference 과 같은 어노테이션을 사용하는 것과
DTO를 이용한 방법이 있었고
어노테이션을 이용한 방법은 정확히 어떻게 순환참조가 되지 않는지 이해가 잘 안되서 DTO를 이용하는 방법으로 CRUD 를 구현

DTO를 각 엔티티의 순환참조가 생길만한 연관관계를 지정하는 멤버를 제외하고 본따서 만듦
게시글과 댓글이 서로 양방향 관계라고 했을 때, 게시글은 댓글 멤버를, 댓글은 게시글 멤버를 뺀 DTO를 구성하고, 각각의 DTO를 더해서 응답 DTO를 만들어내는 로직을 구성

이렇게 되면 순환참조나 N+1 같은 문제를 피할 수 있게 되지만 구현하다 보니 원하는 출력값이 달라질 때마다 응답 DTO가 계속 추가됨

프로젝트를 끝내면서 생각해보니 안전하지만 코드가 길어지고 클래스가 늘어나는 DTO를 이용하는 방법도 최선이 아니겠다 생각을 함

miniproject_hanhae66's People

Contributors

olivelover avatar kanteluv avatar jayb202 avatar seunghee58 avatar

Watchers

 avatar

miniproject_hanhae66's Issues

Unsuppored class file major version 64 빌드오류 발생 (해결)

이슈 내용

깃에서 프로젝트를 가져와서 실행시 빌드를 하지 못하고

“Unsupported class file major version 64” 메세지를 보여주는 오류

해결을 위하여 시도해본 것

https://velog.io/@murphytklee/Unsupported-class-file-major-version-64-%EC%97%90%EB%9F%AC)](https://velog.io/@murphytklee/Unsupported-class-file-major-version-64-%EC%97%90%EB%9F%AC

위 링크에서 해결방법 검색

해결 방법

“File” → “Project Structre”를 가서 아래의 표시한 부분 확인

Untitled

“File” → “Settings” → “Build, Execution, Deployment” → “Gradle” 에서 아래의 표시한 부분을 확인하여 설정 변경 한뒤 SET JDK를 한다.

Untitled

Users table 생성 불가 (해결)

이슈 내용

“Users table” 생성 불가

이슈 원인

user 엔티티에서

String 형태의 PK를 @GeneratedValue(strategy = GenerationType.IDENTITY)

설정을 해주어서 발생하였다.

해결 방법

Untitled

없에 주었다.

UnsatisfiedDependencyException 오류 발생 (해결)

이슈 내용

UnsatisfiedDependencyException 오류 발생

org.springframework.beans.factory**.**UnsatisfiedDependencyException: Error creating bean with name 'commentController' defined in file [C:\Users\tikto\OneDrive\바탕 화면\miniproject_hanhae66\build\classes\java\main\com\sparta\hanghae66\controller\CommentController.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'commentService' defined in file [C:\Users\tikto\OneDrive\바탕 화면\miniproject_hanhae66\build\classes\java\main\com\sparta\hanghae66\service\CommentService.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'commentLikesRepository' defined in com.sparta.hanghae66.repository.CommentLikesRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.util.Optional com.sparta.hanghae66.repository.CommentLikesRepository.findByUsernameAndCommentId(java.lang.String,java.lang.Long); Reason: Failed to create query for method public abstract java.util.Optional com.sparta.hanghae66.repository.CommentLikesRepository.findByUsernameAndCommentId(java.lang.String,java.lang.Long); No property 'username' found for type 'CommentLikes'
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-6.0.8.jar:6.0.8]
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245) ~[spring-beans-6.0.8.jar:6.0.8]

스프링 빈 생성중 발생한 오류

해결 방법

리팩토링 과정에서 달라진 변수에 의한 Repository 쿼리가 맞지 않아 발생한 오류

likeservice에 관한 JPQL쿼리문을 달라진 변수로 바꾸거나 테스트를위해 해당부분 모두 주석

10조분들 프로젝트 마무리 고생하셨습니다

제가 게더에서는 말을 빨리하다보니 피드백이 어지러우셨을까봐 발표내용 들으면서 대충 끄적인건데 참고하시면 좋을 것 같아요!

10조
Github ReadMe작성 좋다
트러블 슈팅 노션페이지 이런거 다 좋다.
대신 에러문제는 노션보다는 개인블로그에 기록하시고 N+1문제 해결해려고했던 노력이나, 조회수를 어떻게 핵심적으로 구현했는지 하는게 좋아보입니다.

jsonIgnore,백레퍼런스 그런 어노테이션 사용 보다 페치조인 사용으로 N+1문제 해결 가능

필요없는 주석문(시큐리티컨피그) 제거할 것
가장 좋은 코드는 주석문없이도 이해되는 코드
주석문이 있다면 유지보수에 어려움 지우기가 되게 애매해짐

리프레쉬 토큰의 의미 -> 현재 상태는 탈취당하면 계속 사용할 수 있음
리프레쉬토큰으로 액세스를 재발급받으면 꼭 리프레쉬를 초기화 시켜줘야함(다른걸로 바꾸는)

리포지토리 쿼리어노테이션으로 jpql사용 -> 비추천합니다.
트러블 슈팅에도 나온 이유로, 오타라던가 컴파일시점에서 잡아줄 수 없는거라
String형태의 쿼리문을 짜는 것은 정말 필요한 경우가 아니면 누구든지 실수를 할 수 있기에 좋지 않습니다.
querydsl이나 JPA로 관리하시는게 실수를 막으며 관련 플러그인으로 JPA Buddy를 사용해보시면 문법을 잘몰라도 쉽게 만들 수 있어요!

Mysql 연결, h2설정 -> 그거는 프로퍼티즈(yaml) 프로파일설정을 통해서 local일떄에는 h2로 , 운영일떄는 다른 프로퍼티로 사용하게끔

쿠키 cors설정 확인 및 테스트필요

userId만 필요한 상황이면 JPA auditing을 사용하시는게 좋은데
이런 유저의 필드를 3개이상 정도 Post가 가져야 되는 상황이면, 연관관계를 맺는게 일반적으로 더 좋아보입니다.

시간관리 측면
다음주차할때는 미리 잘 정해놓거나 스웨거를 빨리적용하시고 변경사항이 있을때마다 프론트분들에게 리마인드 해주시는게 좋아보입니다.

욕설필터에 대해서 아쉬워하셨는데, 시간이 나시면 Xss공격을 막는것도 ,기본적으로 react dom에서 innerHtml기능을 쓰지 않으면 스크립트는 걸러지지만, 그래도 이중으로 처리한다면 더욱 좋으니까요 보안에 있어서는 성능을 생각하시기 보다는 안전을 생각하시는게 좋습니다;

게시글 조회수, DB방식 잘 구현하셨는데,
검색조건 if(로 키워드 마다 나눠서)contain을 하시는 것 보다
이떄야 말로 JPQL을 써볼만한 쿼리어노테이션 +. like문법으로 검색하셨으면 더 좋았을 것 같네요.

ClassCastException 오류 발생 (해결)

이슈 내용

ClassCastException 오류 발생

g.ClassCastException: class java.lang.String cannot be cast to class com.sparta.hanghae66.entity.User (java.lang.String is in module java.base of loader 'bootstrap'; com.sparta.hanghae66.entity.User is in unnamed module of loader 'app')
at com.sparta.hanghae66.service.UserService.login(UserService.java:70) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

이슈 원인

String 타입인 Id를 User 객체로서 사용하련는 과정에서 발생한 오류

해결을 위하여 시도해본 것

try 문 안에

Optional<User> found = userRepository.findByUserId(userId);if (found.isPresent()) { return new ResponseDto("아이디 중복", HttpStatus.*BAD_REQUEST*);}

이곳은 해결되어도 found는 user의 id값만 가지고 있어서

비밀번호 인증에 사용할 수 없었음

해결 방법

@Repositorypublic interface UserRepository extends JpaRepository<User, String> { @Query("SELECT u FROM TB_USER u WHERE u.id = :userId") Optional<User> findByUserId(@Param("userId") String userId);}

UserRepository에서 쿼리문을

@query(”SELECT u. id ….. “) → @query(”SELECT u ….”) 로변경하여

uere의 string id 값만이 아닌 user전체를 가지고 오도록 변경하여 로그인 성공

Untitled

게시글 조회 시 조회수가 올라가지 않는 오류(해결)

이슈 내용

게시글 조회를 하였음에도 조회수가 올라가지 않는 오류가 발생함

• 오류 코드
오류 해결 전

해결을 위하여 시도해본 것

• 테스트 시 visitCnt가 정상적으로 올라가는 것은 확인, 하지만 실제 데이터베이스에 변경되지 않는 것을 체크 후 로직을 다시 살펴보았다.

해결 방법

• 오류 코드에서는 @transactional(readOnly = true) 를 사용하여 조회 작업만 수행,

데이터베이스에서 조회한 post 객체는 영속성 컨텍스트에서 관리되고 있지만 변경이 되지 않았다.

(readOnly = true)를 삭제함으로 간단하게 해결되었다..!

해결 코드

오류 해결 전

게시글 선택 조회 시 코멘트 리스트를 불러오지 못하는 오류(해결)

이슈 내용

게시글 선택 조회 시 코멘트 리스트를 불러오지 못하는 오류가 발생하였다.

• 오류 코드
오류 해결 전1

해결을 위하여 시도해본 것

• 팀원들과 문제점에 대하여 이야기하여 로직 체크
→ 전체 코멘트 리스트를 불러오면서 매칭시킬 게시글의 시퀀스를 가져오지 못하는 로직이 됐음을 확인

해결 방법

• 전체 코멘트 리스트를 가지고 오는 것이 아니라 게시글 시퀀스를 매개변수로 받아 코멘트 리스트를 불러오도록 변경
해결 코드

mySQL 연결 오류(해결)

이슈 내용

H2 → mySQL연결시 데이터베이스를 쿼리를 날려 테이블생성은 되지만

오류가 뜨며 저장이 되지 않음

해결 방법

webSecurityConfig에서 H2권한 허용하는 부분 주석처리

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.