fgrep
: 출력에서 특정 패턴을 포함하는 라인만 걸러내기
mv
: 파일을 이동, 이동과 동시에 바꿀 수도 있음
cp
: 파일을 복사, 디렉토리를 복사할 땐 -r 인수 필요
일대다 연관관계에서 하나를 조회하는데 연관된 관계까지 조회를 하면서 한번의 쿼리에 N개의 추가쿼리가 나가는 문제
spring.jpa.properties.hibernate.default_batch_fetch_size=1000
이 문구를 설정파일에 추가
- 이렇게 하면 처음에 한 번의 쿼리로 N개의 데이터를 가져옴
- 쿼리에 where in 문을 써서 최대 1000개의 데이터에 대한 연관정보를 한 번의 쿼리로 가져옴
@LazyCollection(LazyCollectionOption.EXTRA)
일대다의 '일'엔티티의 필드에 위의 애노테이션을 추가한다.
N+1문제는 여전히 남아있으나 불필요한 필드는 패치하지 않으므로 N의 크기가 작다면 의미있는 성능튜닝이다.
N+1은 N의 크기자체만으론 성능에 어느정도 영향을 미치는지 알기 힘들다.
jmeter와 같은 도구로 실제 테스트로 비교를 해보는 것이 일반적
스프링시큐리티는 기본적으로 인증, 인가기능을 제공해준다.
필터체인틀 정의하면 나만의 인증, 인가 시스템을 구현할 수 있다.
스프링 시큐리티는 뷰의 입력폼에 csrf토큰을 자동으로 생성해준다.
사용자 보안 서비스를 직접 정의하지 않으면 스프링시큐리티 자체의 보안 서비스를 이용한다.
우리가 만든 회원리포지토리를 서비스가 이용하게 하려면 다음과 같이 서비스를 정의한다.
@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);
}
}