개발로그

개발로그

[개발로그] 패키지 의존성(단방향 연관관계) 테스트 ArchUnit, TestContainers for JAVA

패키지 의존성 테스트 간단한 글, 댓글, 유저만 있는 CRUD를 만들때도 모두 양방향 연관관계 맵핑 이후에 DTO로 만들 때 순환참조를 막았었는데 서비스에 필요한 단방향 연관관계만으로 이런 과정을 생략할 수 있다. 단방향으로 참조를 하고 있는지 확인 할 수 있는 ArchUnit 라이브러리를 사용해 패키지 간 의존성 참조받는 것과 하는 것, 순환참조 여부를 눈이 아니라 테스트 코드로 확인할 수 있다. 기준 버젼은 자바 17, 스프링부트 2.7.11 이다. gradle testImplementation group: 'com.tngtech.archunit', name: 'archunit-junit5', version: '0.13.1' code public class PackageDependencyTests {..

개발로그

[개발로그] Google SMTP, 서비스 추상화,Thymeleaf Context

SMTP 콘솔로 찍던 javaMailSendor 대신 구글의 SMTP를 이용해 실제 메일을 보낸다. 먼저 구글 계정이 필요하다. 가입 완료했으면 계정관리 > 보안에 들어가 2단계 인증을 한다. 이후 2단계 인증 탭을 클릭하고 스크롤을 아래로 내리면 앱 비밀번호를 만들 수 있는 탭이 있다. 2021년부터 앱 비밀번호는 구글에서 권장하지 않는 방법이고 실제 이메일 서비스보다는 제한이 있지만 설정이 간단해서 사용한다. // application.yml spring: mail: host: smtp.gmail.com port: 587 username: ${mail.username} password: ${mail.password} properties: mail: smtp: auth: true timeout: 500..

개발로그

[개발로그] SpringBoot + Ajax, CSRF

Ajax(Asynchronous Javascript and XML) 웹 페이지 전체를 새로고침하지 않고 웹 페이지의 일부만을 갱신할 수 있게한다. CSRF(Cross Site Request Forgery) 사용자가 이미 로그인해서 들고있는 세션정보를 악의적인 링크를 클릭하게 해서 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(등록, 수정, 삭제)를 특정 웹 사이트에 요청하게 만드는 공격이고, 이를 막기위해 csrf 토큰을 사용한다. Spring MVC를 사용하면 디폴트로 csrf 토큰 관리를 제공하고, Spring Security를 사용하면 디폴트로 csrf 보호가 시작된다. Thymeleaf 템플릿 엔진은 프론트 엔드단에서의 csrf 토큰 관리를 지원해줘 별다른 추가 없이도 POST 요청을 보..

개발로그

[개발로그, Spring MVC] View에서 접근 가능한 유저정보를 컨트롤러에서 Model로 넘겨주는 이유

UserDetails @Getter public class UserAccount extends User { private Account account; public UserAccount(Account account) { super(account.getNickname(), account.getPassword(), List.of(new SimpleGrantedAuthority("ROLE_USER"))); this.account = account; } } 해당 UserDetails를 Principal로 AuthenticationToken을 Security Context에 저장하고 Thyemleaf Extras를 통해 Security Context에 접근할 수 있다. View에서 Context 바로 접근 Con..

개발로그

[개발로그] Security Context 유저 정보와 DB 유저 정보 동기화

Security Context의 정보와 DB의 정보가 다를 때? Spring Security를 세션방식과 함께 이용한다면 로그인 시에 Security Context에 AuthenticationToken(UserDetails, Password, Granted)를 저장하고 세션이 만료되거나 로그아웃 될 때까지 전역적으로 사용할 수 있다. 하지만 로그인 중에 유저 정보가 변해도 Security Context가 들고있는 정보는 업데이트가 되지 않기 때문에 동기화를 시켜줘야한다. 코드 예시 유저 Entity와 Entity를 필드로 갖는 UserDetails를 정의한다. @Entity @Getter @EqualsAndHashCode(of = "id") @NoArgsConstructor public class Acc..

개발로그

[개발로그] @ModelAttribute 기본생성자가 필요한 경우

@ModelAttirbutes 동작과정 1. 클라이언트로부터 전송된 폼 데이터가 컨트롤러에 도착 2. 스프링은 폼 데이터를 바탕으로 @ModelAttribute 붙은 클래스의 객체 생성 3. 폼 데이터의 필드 이름과 객체 필드의 이름과 일치하는 경우 폼 데이터의 필드의 값을 객체 필드에 할당 4. 객체의 생성과 필드 할당이 이뤄지면 컨트롤러 메서드의 파라미터로 전달 2~3번 과정은 ArgumentResolver에서 이뤄지며 다음의 과정을 거친다. 1. 기본 생성자를 확인하고 있다면 사용해서 객체 생성 2. 기본 생성자가 없다면 폼 데이터와 일치하는 매개변수를 가지는 다른 생성자를 찾음 3. 폼 데이터의 필드 이름과 생성자의 매개변수 이름이 일치하는 경우 해당 생성자를 사용해 객체 생성 기본생성자가 필요할..

개발로그

[개발로그] Spring Security Authorized Test, RedirectAttributes,

Spring Security Authorized Test @WithMockUser, @WithAnonymousUser는 실제 DB의 데이터가 아닌 username, password, role 등의 간단한 테스트 일 때 사용하고,구현한 UserDetails로 인증정보를 관리하고 있을 때는 @WithUserDetails를 통해 인가된 사용자에 대한 테스트가 가능하다. @WithUserDetails Test시 구현한 UserDetails를 UserDetailsService.loadUserByUsername을 통해 Security Context에 넣어준다. 유저를 DB에 저장하는 로직을 @BeforeEach에 위치할 때 @WithUserDetails가 @BeforeEach보다 빠르게 동작해서 DB에 유저를 저장..

개발로그

[개발로그+JPA] OSIV(Open Session In VIew), Detached Entity Control

트랜잭션의 범위와 영속성 컨텍스트의 범위는 별개 짧게 결과만 말하자면 위와 같다. 지금까지 트랜잭션의 범위 == 영속성 컨텍스트의 범위라고 알고 사용해서 종종 느껴지는 이게 왜 되는건지에 대한 문제가 OSIV 때문이였다. OSIV 설명 전에 엔티티의 생명주기 먼저 복습하고 간다. 엔티티의 생명주기 비영속 transient 객체를 생성하고 영속성 컨텍스트가 관리는 안하는 상태 보통의 경우 엔티티 식별자(id)를 DB에 맡기기 때문에 아직 식별자가 존재하지 않는다. 영속 managed 영속성 컨텍스트에 저장된 상태 비영속 엔티티를 persist 하거나 DB의 엔티티를 find 시 영속성 컨텍스트에 영속된다. 준영속 detached 영속성 컨텍스트에 저장되었다가 분리된 상태 저장되었던 적 있기 때문에 엔티티 ..

비오베베
'개발로그' 카테고리의 글 목록 (3 Page)