@ModelAttirbutes 동작과정 1. 클라이언트로부터 전송된 폼 데이터가 컨트롤러에 도착 2. 스프링은 폼 데이터를 바탕으로 @ModelAttribute 붙은 클래스의 객체 생성 3. 폼 데이터의 필드 이름과 객체 필드의 이름과 일치하는 경우 폼 데이터의 필드의 값을 객체 필드에 할당 4. 객체의 생성과 필드 할당이 이뤄지면 컨트롤러 메서드의 파라미터로 전달 2~3번 과정은 ArgumentResolver에서 이뤄지며 다음의 과정을 거친다. 1. 기본 생성자를 확인하고 있다면 사용해서 객체 생성 2. 기본 생성자가 없다면 폼 데이터와 일치하는 매개변수를 가지는 다른 생성자를 찾음 3. 폼 데이터의 필드 이름과 생성자의 매개변수 이름이 일치하는 경우 해당 생성자를 사용해 객체 생성 기본생성자가 필요할..
Spring Security Authorized Test @WithMockUser, @WithAnonymousUser는 실제 DB의 데이터가 아닌 username, password, role 등의 간단한 테스트 일 때 사용하고,구현한 UserDetails로 인증정보를 관리하고 있을 때는 @WithUserDetails를 통해 인가된 사용자에 대한 테스트가 가능하다. @WithUserDetails Test시 구현한 UserDetails를 UserDetailsService.loadUserByUsername을 통해 Security Context에 넣어준다. 유저를 DB에 저장하는 로직을 @BeforeEach에 위치할 때 @WithUserDetails가 @BeforeEach보다 빠르게 동작해서 DB에 유저를 저장..
트랜잭션의 범위와 영속성 컨텍스트의 범위는 별개 짧게 결과만 말하자면 위와 같다. 지금까지 트랜잭션의 범위 == 영속성 컨텍스트의 범위라고 알고 사용해서 종종 느껴지는 이게 왜 되는건지에 대한 문제가 OSIV 때문이였다. OSIV 설명 전에 엔티티의 생명주기 먼저 복습하고 간다. 엔티티의 생명주기 비영속 transient 객체를 생성하고 영속성 컨텍스트가 관리는 안하는 상태 보통의 경우 엔티티 식별자(id)를 DB에 맡기기 때문에 아직 식별자가 존재하지 않는다. 영속 managed 영속성 컨텍스트에 저장된 상태 비영속 엔티티를 persist 하거나 DB의 엔티티를 find 시 영속성 컨텍스트에 영속된다. 준영속 detached 영속성 컨텍스트에 저장되었다가 분리된 상태 저장되었던 적 있기 때문에 엔티티 ..
회원가입 시 이메일 인증 하는 이유 본인인증이 포함되어야 무차별적 회원가입을 막을 수 있다. 로그인, 이메일 인증 과 같이 인증 진행 중 실패시에 응답을 애매하게 줘야 하는 이유 너무 친절한 인증 실패 메세지는 공격자에게 힌트를 주는 것과 같다. PasswordEncoder 사용자가 회원가입할 때 제공하는 비밀번호를 평문으로 DB에 저장하면 절대 안되고 무조건 암호화 해야한다. Spring Security가 제공하는 PasswordEncoder를 통해 어떤 알고리즘을 사용해 암호화할지 정할 수 있다. 평소에 같은 평문을 암호화한 해쉬값이 맨날 달라진건 알았지만 왜 그런건진 몰랐는데 이는 솔트 때문이다. // BcryptPasswordEncoder @Override public String encode(C..
@Basic @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Basic { /** * (Optional) Defines whether the value of the field or property should * be lazily loaded or must be eagerly fetched. The EAGER * strategy is a requirement on the persistence provider runtime * that the value must be eagerly fetched. The LAZY * strategy is a hint to the persistence provider runtime. * If not specif..
N+1 문제 이전에 김영한님의 JPA 강의 중 연관관계 어노테이션에 @XToOne에 Fetch.Type을 LAZY를 추천한다. @XToMany는 기본으로 LAZY가 걸려있지만 @XToOne은 EAGER가 걸려 SELCT 하는 엔티티가 참조하는 엔티티도 모두 불러오기 때문이다. 참조 타입을 LAZY로 걸고 해당 엔티티를 사용하지 않으면 N+1 문제를 발생하는 쿼리를 발생시키지 않지만 LAZY를 걸어도 해당 엔티티를 사용하면 엔티티 프록시 객체는 모든 값을 가지고 있지 않기 때문에 값을 가져오기 위해 (영속성 컨텍스트,DB)로 N+1 문제를 발생하는 쿼리를 날린다. Join, Fetch Join Spring Data JPA가 제공해주는 것 외에도 JPQL을 사용해야하는 경우엔 @Query를 사용한다. JPQ..
후기 전공자의 입장으로 이주일 정도 유튜브 영상만 봤는데 가채점 90점 정도로 쉬웠습니다. 평소 실기와 달리 기출문제가 많이 나왔고 개발자 준비중인데 프로그래밍 문제로 자바와 SQL이 많이 나온 덕분인 것 같네요. 기초적인 개념을 몰라도 일단 흥달쌤 실기 기출해설(무료 유튜브)을 들어보고 책을 사든, 추가적인 강의를 사는 것을 추천합니다. 공부법 1. 흥달쌤 기출강의 목록을 돌리면서 빈출개념을 반복적으로 공부 2. 프로그래밍 문제 위주로 모르는 언어 or SQL 집중적으로 공부 3. 흥달쌤 기출강의 목록을 다시 돌리면서 빈출 + 신규 + 프로그래밍 복습 06.09 시험 결과 인증 https://www.youtube.com/@HeungSsaem 흥달쌤 흥달쌤과 함께하는 IT 채널입니다. 정보처리기사 자격증..