Code Monkey home page Code Monkey logo

nbc-review-assignment's People

Contributors

uiseongsang avatar

Watchers

 avatar

nbc-review-assignment's Issues

QueryDsl 적용 2가지 방법

내가 사용한 첫번쨰 방법

가장먼저 Querydsl를 사용할 떄 패키지를 정의를 해야한다

Spring boot 2.x는 추가적으로 정의할게 많아서 직접 찾아보시고...

Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

적용이 완료가 되면 grade > build > build를 누르면 build > generated 에 하위 패키지들중에서 Q*** 하면서 Q뒤에 엔티티이름이 들어간게 있을 것이다!! 그것은 나중에 쓸일이 있다

public interface PostRepository extends JpaRepository<Post,Long>, PostRepositoryQuery {

PostRepository에 PostRepositoryQuery를 extends한다
->PostRepositoryQuery은 커스텀으로 만든건데 바로 이어서 설명 하겠다

public interface PostRepositoryQuery {
List<Post> getPostList();

-> 우리가 PostRepository에서 Query Method로 선언하듯이 동적 querydsl를 정의할 메소드를 선언한다(PostRepositoryImpl에서 implements 해줄거임)

우리가 가장 먼저 gradle에 dependencies에 넣어주고 나서 Build에서 build를 해주면 Q Class가 Entity마다 생기는데 그것을 Querydsl문에 넣어 줄것이다!
-> 자세한 설명은 추가적으로 넣을 예정

public class PostRepositoryImpl extends QuerydslRepositorySupport implements PostRepositoryQuery{
public PostRepositoryImpl() {
super(Post.class);
}
@PersistenceContext
EntityManager em;
@Override
public List<Post> getPostList() {
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QPost qPost = QPost.post;
List<Post> res = queryFactory
.selectFrom(qPost)
.orderBy(qPost.createdAt.desc())
.fetch();
return res;
}

친절한 설명은 아니지만... 내가 볼라고 적어 논거라 추가적인 설명은 나중에 해볼 생각이다
아무튼 이렇게 작성이 완료하고 Postman으로 테스트를 하면 잘 된다!

내가 사용한 두번쨰 방법

수정 코드

Querydsl를 쓸 때마다 JPAQueryFactory에 EntitiyManager를 넣어주는것이 반복이 될거 같아서 분리해주는 작업을 했다!

가장 먼저 QuerydslConfig를 만들어서 JPAQueryFactory에 EntitiyManager를 넣어주는 작업을 한다.

Config 파일이 없으면
Consider defining a bean of type 'com.querydsl.jpa.impl.JPAQueryFactory' in your configuration.
이 에러가 뜬다!

QuerydslConfig에 EntityManager를 빈으로 주입할 때 사용하는 어노테이션인 @PersistenceContext를 사용해서 빈으로 주입을 한다.

여기서

@PersistenceContext를 사용해야 하는 이유

  1. EntityManager를 사용할 때 주의해야 할 점은 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여 쓰레드 간에는 EntityManager를 공유해서는 안됩니다.
  • 일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다.
  • 그러나 @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않습니다.
  1. 동시성 문제가 발생하지 않는 이유

일단은 PostRepository하고 PostRepositoryQuery는 변화가 없고 PostRepositoryImpl만 일부분 수정을 하였다

PostRepositoryImpl을 보면 QuerydslRepositorySupport을 지워주고
@repository를 넣어준다. QuerydslRepositorySupport에 @repository가 있기떄문에 안 넣어줬던것이다.

@Repository
@RequiredArgsConstructor
public class PostRepositoryImpl implements PostRepositoryQuery{
private final JPAQueryFactory queryFactory;
@Override
public List<Post> getPostList() {
QPost qPost = QPost.post;
List<Post> res = queryFactory
.selectFrom(qPost)
.orderBy(qPost.createdAt.desc())
.fetch();
return res;
}

프로젝트 피드백 - 작성자 : 조진영 튜터

과제 하느라 수고하셨습니다 !

우선 커밋메시지 구현하신 기능단위로 쪼개서 올려주신거 너무 좋네요!

기본적인 엔티티의 CRUD흐름, dto를 통한 컨트롤러 리턴, SpringSecurity를 사용한 인가, 토큰을 사용한 인증 처리가 모두 구현되어 있네요!

복잡하지 않은 프로젝트라도 readMe를 이용해서 프로젝트의 설명이 있다면 훨씬 좋을거 같습니다.

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.