To be able to use authorizeResource() in Laravel 11, your base controller class in app\Http\Controllers\Controller.php should extend \Illuminate\Routing\Controller (because that's where the middleware() method is), just like the Controller.php file found in a fresh Laravel 10 installation.
Laravel11 에서는 app\Http\Controllers\Controller.php 파일에 작성된 클래스가 상속받아야 한다는 것이다. 상속 대상 클래스가 middleware 메소드를 구현하고 있다고 한다. 그래서 해당 파일을 아래와 같이 작성하였다.
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
abstractclassControllerextends\Illuminate\Routing\Controller
{
use AuthorizesRequests;
}
이후 기존에 작성한 ArticleController로 돌아가보니 middleware 메소드를 사용하는 부분의 warning 라인이 없어지고 command+클릭으로 이동하니 AuthorizesRequesets 파일로 이동했다!
그리고 기능도 정상적으로 동작하였다!
[테스트로 기능확인]
middleware를 적용하고 기존에 작성한 테스트코드를 실행해보니 테스트가 실패하였다.
인증관련해서 404가 나올줄알았지만 302인 이유는 실제 화면에서는 미인증 유저가 해당 화면에 접근할 경우 로그인 화면으로 "리다이렉트" 시키기 때문이다! 따라서 리다이렉트 코드인 302가 반환되었다.
해당 테스트코드는 미인증 회원의 접근이 잘 막아지는지로 코드를 수정하고, 로그인한 회원의 테스트코드를 작성하였다.
// 2) DB 파사드를 이용하는 방법 : Laravel 을 사용해 DB 사용하기
DB::insert ("INSERT INTO articles (body, user_id) VALUES (:body, :userId)", ['body' => $input['body'], 'userId' => Auth::id()]);
DB 뒤의 명령어는 상황에 따라 다른데 아래와 같다
- statement : insert, selectl, update, delete가 아닌 경우에 + index를 만든다거나 할때 사용한다 - CRUD : insert, select, update, delete 메소드 사용
[3] 쿼리 빌더 사용
1) insert 하기
// 3) 쿼리 빌더를 사용하는 방법
DB::table('articles') ->insert([
'body' => $input['body'],
'user_id' => Auth::id()
]);
위 방법대로 쿼리 빌더를 사용하면 1번이나 2번과 달리 query 문을 작성하지 않아도 된다는 점이 있다.
dataclassBookStatResponse(
val type: BookType,
val count: Int,
)
> 코드 설명
1) findAll() 을 사용해 도서관에 등록되어 있는 모든 책을 조회한다 List<Book>
2) groupBy 를 사용해 카테고리 별 Map 으로 만들어준다 Map<BookType, List<Book>>
3) map 을 사용해 BookStatResponse DTO에 카테고리별 갯수를 담아준다 List<BookStatResponse
> 해결한 것
- BookStatResponse data class의 count 필드가 불변 필드로 되어 의도치 않은 수정을 막을 수 있다.
- 코드가 간결해 졌다.
> 문제점
도서관에 등록된 책의 전체 목록을 조회하여 그 갯수를 세는 과정이므로 db부하 등을 걱정해야 한다.
(전체 데이터 쿼리 => 메모리 로딩 + grouping)
[4] JPQL + Spring data JPA 활용하기 (예제 2개)
1] (위 예제와 이어지는 예제) 예제 1 : Book 기능
bookRepository에 커스텀 query function을 작성한다.
//jpql@Query("select new com.group.libraryapp.dto.book.response.BookStatResponse(b.type, count(b.id)) " +
"from Book b group by b.type")fungetStats(): List<BookStatResponse>
@Query("select distinct u from User u left join fetch u.userLoanHistories")funfindAllWithHistories(): List<User>
> 문제점
- 오타 문제
- 조건이 추가된다면 또 다른 jpql 문을 작성해야 한다.
- 어떤것을 참조하는지 타고 들어가 봐야 안다.
[5] Querydsl (예제 2개)
0] 코프링에 querydsl 적용하기
1) gradle 추가
먼저 코프링 환경에서 querydsl을 사용하기 위해서 gradle 에 추가해주어야 한다.
// plugin
id "org.jetbrains.kotlin.kapt" version "1.6.21"// dependecy
implementation("com.querydsl:querydsl-jpa:5.0.0")
kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
kapt("org.springframework.boot:spring-boot-configuration-processor")
참고로 환경은 스프링 부트 3버전 / intelliJ 23.1버전 / kotlin 1.16 버전 이다.
설정 변경후 빌드를 하면 build > generated > source > kapt > main > .....{프로젝트 루트} ..... > domain 에 User와 Book이 아닌 QUser QBook 처럼 앞에 Q가 붙은 클래스들이 생성된걸 볼 수 있다.
2) 스프링 빈 등록
그리고 나서 QuerydslConfig 파일을 만들어 Component로 등록하고 JPAQueryFactory를 Bean으로 생성한다.