TIL - day25

정상화·2023년 3월 28일
0

TIL

목록 보기
20/46
post-thumbnail

fgrep

fgrep : 출력에서 특정 패턴을 포함하는 라인만 걸러내기


파일 이동

mv : 파일을 이동, 이동과 동시에 바꿀 수도 있음

파일 복사

cp : 파일을 복사, 디렉토리를 복사할 땐 -r 인수 필요


N+1 문제

일대다 연관관계에서 하나를 조회하는데 연관된 관계까지 조회를 하면서 한번의 쿼리에 N개의 추가쿼리가 나가는 문제

첫번째 해결책

spring.jpa.properties.hibernate.default_batch_fetch_size=1000

이 문구를 설정파일에 추가

  1. 이렇게 하면 처음에 한 번의 쿼리로 N개의 데이터를 가져옴
  2. 쿼리에 where in 문을 써서 최대 1000개의 데이터에 대한 연관정보를 한 번의 쿼리로 가져옴

두번째 해결책

@LazyCollection(LazyCollectionOption.EXTRA)

일대다의 '일'엔티티의 필드에 위의 애노테이션을 추가한다.
N+1문제는 여전히 남아있으나 불필요한 필드는 패치하지 않으므로 N의 크기가 작다면 의미있는 성능튜닝이다.

N+1은 N의 크기자체만으론 성능에 어느정도 영향을 미치는지 알기 힘들다.
jmeter와 같은 도구로 실제 테스트로 비교를 해보는 것이 일반적


스프링 시큐리티

스프링시큐리티는 기본적으로 인증, 인가기능을 제공해준다.

필터체인틀 정의하면 나만의 인증, 인가 시스템을 구현할 수 있다.

csrf토큰

스프링 시큐리티는 뷰의 입력폼에 csrf토큰을 자동으로 생성해준다.

UserSecurityService

사용자 보안 서비스를 직접 정의하지 않으면 스프링시큐리티 자체의 보안 서비스를 이용한다.
우리가 만든 회원리포지토리를 서비스가 이용하게 하려면 다음과 같이 서비스를 정의한다.

@RequiredArgsConstructor
@Service
public class UserSecurityService implements UserDetailsService {
   private final UserRepository userRepository;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       Optional<SiteUser> siteUserOptional = userRepository.findByName(username);
       if (siteUserOptional.isEmpty()) {
           throw new UsernameNotFoundException("사용자를 찾을 수 없습니다.");
       }
       SiteUser siteUser = siteUserOptional.get();
       List<GrantedAuthority> authorities = new ArrayList<>();
       if ("admin".equals(username)) {
           authorities.add(new SimpleGrantedAuthority(UserRole.ADMIN.getValue()));
       } else {
           authorities.add(new SimpleGrantedAuthority(UserRole.USER.getValue()));
       }
       return new User(siteUser.getName(), siteUser.getPassword(), authorities);
   }
}
profile
백엔드 희망

0개의 댓글