Beyond SW Camp 16기 10주차 회고

publicguard_·2025년 7월 31일

Beyond SW Camp

목록 보기
8/9

📅 Week 10 : 07/21 ~ 07/25
7/21 : spring seurity 기본설정
7/22 : jwt
7/23 : 권한관리, 스케줄러, 검색(Specification)
7/24 : AWS S3
7/25 : Spring 복습
7/21~7/25 : 프로젝트

WIL(Week I Learned)

[Spring Security]

@PreAuthorize를 이용한 권한 관리

//회원목록 조회
// @PreAuthorize("hasRole('ADMIN')") : ADMIN 권한 사용자만 접근을 허용한다.
@GetMapping("/list")
@PreAuthorize("hasRole('ADMIN')")
public List<AuthorListDto> findAll(){
	return this.authorService.findAll();
}

Controller단에 @PreAuthorize를 붙여 api별 접근 권한을 쉽게 설정할 수 있다.
접근 권한 외 사용자가 접근할 경우 403 Forbidden 코드와 함께 "Access Denied" 메시지가 반환된다. 예전에 이거를 몰라서 일일히 프론트 코드에 권한을 비교하는 로직을 넣었는데, 이제는 그럴 필요가 없을 것 같다.

PostMan의 EnviorMent 기능을 이용한 토큰 자동 주입

PostMan의 Enviorment 기능을 이용해 로그인을 하게되면 토큰이 enviorment에 자동 세팅되어 관련 테스트를 쉽게 진행하는 방법을 터득했다.
테스트 시 아주 유용하게 쓸 것 같다.

Specifiaction을 이용한 검색 기능 구현

public Page<PostListDto> findByAll(Pageable pageable, PostSearchDTO postSearchDTO){
//        검색을 위해 Specification 객체 스프링에서 제공
//        Specification 객체는 복잡한 쿼리를 명세를 이용하여 정의하는 방식으로, 쿼리를 쉽게 생성.
//        페이지처리 findAll 호출
        Specification<Post> specification = new Specification<Post>() {
            @Override
            public Predicate toPredicate(Root<Post> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
//                Root : 엔티티의 속성을 접근하기 위한 객체, CriteriaBuilder : 쿼리를 생성하기 위한 객체
                List<Predicate> predicateList = new ArrayList<>();
                predicateList.add(criteriaBuilder.equal(root.get("delYn"), "N"));
                predicateList.add(criteriaBuilder.equal(root.get("appointment"), "N"));
                if(postSearchDTO.getCategory() != null){
                    predicateList.add(criteriaBuilder.equal(root.get("category"), postSearchDTO.getCategory()));
                }
                if(postSearchDTO.getTitle() != null){
                    predicateList.add(criteriaBuilder.like(root.get("title"), "%" + postSearchDTO.getTitle() + "%"));
                }
                Predicate[] predicateArr = new Predicate[predicateList.size()];
                for(int i=0;i<predicateList.size();i++){
                    predicateArr[i] = predicateList.get(i);
                }

//                위의 검색 조건들을 하나(한줄)의 Predicate 객체로 만들어서 return
                Predicate predicate = criteriaBuilder.and(predicateArr);
                return predicate;
            }
        };
        Page<Post> postList = postRepository.findAll(specification, pageable);
        return postList.map(a->PostListDto.fromEntity(a));
    }

스프링에서는 검색을 위해 Specification 인터페이스를 제공한다.
Specification은 스프링 데이터 JPA에서 동적 쿼리 생성을 위한 인터페이스다. 이에 대해서는 별도의 글로 정리해두었다.

[정리]
https://github.com/SuOhYoon/spring

한주를 돌아보며....

벌써 입과한지 10주가 지났다. 시간 참 빠른것 같다.

이번주는 정신없이 많은 것을 배운 한 주 였다. 권한관리, 검색, 토큰 자동 할당 등 Spring에 대한 모르는 것들을 정말 많이 배웠다.

이번주부터 본격적으로 팀 프로젝트 BE 부분에 대한 개발을 시작했다.
팀장을 맡아 다른 팀원들보다 성실하게 개발에 임하고, 팀원들의 코드를 성심성의껏 리뷰했다. 물론 리뷰어를 담당한 팀원이 있었기에 코드 리뷰가 더 잘됬던것 같다.

좋았던 점

[발목 상태 호전]
발목 상태가 더 좋아져서 이제는 체중부하가 100% 가능해졌다.
정상 보행도 가능해져 글 작성 시점(부상 29일차)에는 부목을 때고 발목보호대로 전환했다. 이제 슬슬 물리치료도 줄여야 할 타이밍이 된 것 같다.

[팀 프로젝트간 첫 협업 및 코드리뷰]
처음으로 팀 프로젝트를 진행하면서 PR을 보고 코드리뷰를 진행하였다.
코드리뷰를 통해 팀원들의 의견들을 수렴하면서 내 코드 또는 상대방이 작성된 코드가 Develop되는 좋은 시간이 되었던 것 같다. 내 코드를 리뷰하면서 내 코드가 잘 작성된 코드인지, 또 어떻게 해야 코드를 Develop할 수 있는지에 대해 알게 된것 같다. 또한 PR과 더불어 브랜치 관리 방법도 이해했다.
기능마다 브랜치를 파서 기능 개발을 진행한뒤, 기능 개발이 끝나면 PR을 통해 코드 리뷰를 진행하고, 리뷰가 끝나면 통합 브랜치에 merge후 해당 브랜치 삭제, 이후 다시 새 브랜치를 파서 기능 개발을 진행하는 식의 브랜치 관리 및 PR 방법에 대해 이해했다.

아쉬웠던 점

개선해야 할 점

[코테 공부 미흡]
Spring 복습과 프로젝트 집중으로 자꾸 코테 문제를 안풀게 되는 것 같다.
한 문제라도 더 풀어보고, 복습하려고 노력해야 겠다....

[회고 밀리지 않기]
마찬가지다. 위 두가지 사유로 계속 블로그 작성을 미루게 되는 것 같다.
일요일 밤에 회고글을 업로드 하는 습관을 계속 들여야 할 것 같다.

마무리

참 다사다난한 한 주 였다.
그래도 Spring을 더 깊게 이해하는 것 같아서 좋았고, 프로젝트를 하면서 팀 내 큰 갈등이 아직까지는 발생하지 않아서 좋았던 것 같다.
앞으로 내 자신을 더 Develop 시켜서 Jump-Up 하는 개발자가 되야겠다.

profile
백엔드 개발자로 하루하루 성장 중인 publicguard_의 개발일기입니다.

0개의 댓글