전체 글 (197) 썸네일형 리스트형 [Spring] MockMvc 테스트에서 with(csrf()) 자동화 하기 1. 사건 발달스프링 시큐리티 환경에서 MVC를 테스트하기 위해서는 요청 헤더에 CSRF 토큰이 필요하다. 따라서 아래 코드와 같이 perform() 시에 요청 헤더에 스프링 시큐리티가 생성한 CSRF 토큰을 포함할 수 있다.근데 테스트 코드를 작성할 때마다 CSRF 토큰을 일일이 추가하는 것보단, 테스트 실행 전에 자동으로 추가할 수 있지 않을까? @WithMockUser@WebMvcTest(controllers = SectionController.class)class SectionControllerTest { @Test @DisplayName("신규 회고카드를 등록한다.") void createSection() throws Exception { //given .. [Spring] 스프링 시큐리티 환경에서 @WebMvcTest 사용 시에 발생하는 401, 403 에러 해결하기 우리 프로젝트는 Spring Security를 사용하여 사용자의 인증 정보와 권한 정보를 관리하고 있다. 따라서 사용자의 인증과 권한 정보에 따라서 API 요청이 서버로 도달하게 할 것인지 결정한다. @WebMvcTest 애너테이션을 사용하여 Spring MVC의 Presentation Layer 테스트가 가능하다. 즉, 스프링에서는 Controller에 대한 테스트를 하게 된다. 1. 테스트 환경1-1. Controller@CurrentUser 애너테이션을 사용하여, 요청 헤더에 담긴 Bearer 토큰을 통해 인증된 사용자 정보를 가져온다.@ResponseStatus(HttpStatus.CREATED)를 통해 응답 상태 코드로 201을 갖는다.@RestController@RequestMapping(".. [JPA] 읽기 전용 트랜잭션과 JPA 1차 캐시의 동작 원리 1. @Transactional트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다. 스프링 프레임워크로 개발하는 경우 보통 Business Layer에 @Transactional을 사용한다. 기본적으로 @Transactional은 CRUD 시에 사용할 수 있다. 즉, Query와 Command를 구분하지 않고 사용할 수 있다.예를 들어, @Transactional을 사용하여 save() 메서드에서 생성된 member 객체를 데이터베이스에 저장할 수 있다. @Transactional을 사용하면 트랜잭션 AOP가 동작하면서 메서드 시작과 끝에 transactional.begin()과 transactional.commit()을 추가하기 때문이다. 단, 중간에 예외가 발생하면 transac.. 블로킹 큐(Blocking Queue) 블로킹 큐(Blocking Queue)는 동기화와 스레드 안전성을 보장하는 자료구조이다. 주로 멀티 스레드 환경에서 사용되며, 생산자-소비자 패턴과 같은 문제를 해결할 때 유용하다.블로킹 큐의 동작 방식블로킹 큐는 큐가 비어 있거나 가득 찼을 때, 큐에 데이터를 넣거나 빼려는 스레드가 일정 조건을 만족할 때까지 대기 상태(블로킹)에 들어간다. 이를 통해 스레드 간의 안전한 데이터 공유가 가능하다.삽입 시 대기큐가 가득 찬 경우, 데이터를 삽입하려는 스레드는 큐에 빈 공간이 생길 때까지 대기한다.다른 스레드가 큐에 데이터를 소비해서 자리가 생기면, 삽입하려는 스레드는 대기 상태에서 깨어나고 데이터를 큐에 넣을 수 있다.삭제 시 대기큐가 비어 있는 경우, 데이터를 꺼내려는 스레드는 큐에 새로운 데이터가 삽입.. 논 블로킹 I/O (비동기 방식) 동기 방식은 블로킹 I/O에서는 실행 상태에서 CPU 자원을 사용하던 프로세스가 입출력 작업이 발생하면 대기 상태로 이동한다. 대기 상태로 이동하면 사용하던 CPU 자원은 운영체제의 CPU 스케줄링에 의해 준비 상태에 있는 다른 프로세스에게 할당한다. 입출력 작업이 종료되면 대기 상태에서 준비 상태로 이동되어 CPU 스케줄링을 대기하게 된다. 비동기 방식인 논 블로킹 I/O에서는 실행 상태에 있는 프로세스가 입출력 작업이 발생하더라도 실행 상태를 유지하면서 CPU 자원을 사용한다. 이는 운영체제의 비동기 처리 메커니즘 덕분이다. 이 메커니즘은 CPU가 입출력 작업이 완료되기까지 기다리지 않고, 그 사이에 다른 작업을 할 수 있도록 하여 CPU 자원을 보다 효율적으로 사용할 수 있게 한다. 비동기 방식 메.. [Spring] Spring AOP(Aspect-Oriented Programming) 1. 스프링 AOP란?AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)이라고 부르며, 프로그램의 핵심 기능 외에 부가적인 기능을 분리해서 모듈화 하는 기법이다. 핵심 비즈니스 로직과는 직접적인 관계가 없는 로직들(ex. 로깅, 트랜잭션)이 코드의 여러 부분에서 반복될 수 있다. AOP는 비즈니스 로직과 상관없는 반복적인 코드들을 별도의 모듈로 관리하여 코드의 유지 보수를 쉽게 하고 핵심 비즈니스 로직에 집중할 수 있도록 한다.ex) @Transactional은 트랜잭션 처리라는 부가적인 기능을 애너테이션으로 적용하는 방식이다. 원래는 트랜잭션을 사용하려면 transaction.begin(), transaction.commit(), transaction.rollback() .. [JPA] 테스트 코드에서 JPA + @Trasnactional 사용 시 주의점 예제 코드Member.classupdateUsername()을 통해 사용자의 이름을 변경할 수 있다.@Entity@Setter@Getterpublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "member_id"), inverseJoinColumns = @JoinColumn(name = "pr.. TDD (Test-Driven Development) TDD란?프로덕션 코드를 먼저 작성하는 것이 아닌 테스트 코드를 먼저 작성한다. RED : 테스트에 실패하는 코드를 작성한다.테스트할 프로덕션 코드가 없기 때문에 에러가 발생한다.GREEN : 테스트를 통과할 수 있도록 최소한의 코드만 작성한다.프로덕션 코드가 엉터리여도 된다. 단순히 테스트 통과만을 위한 프로덕션 코드를 작성한다.BLUE : 테스트 통과는 유지하면서 프로덕션 코드를 개선한다. TDD - REDcalculateTotalPrice()는 프로덕션에서 실제로 사용할 코드에 대한 테스트 코드를 작성한다. CafeKiosk 클래스의 calculateTotalPrice() 메서드는 아직 작성되지 않은 상태이다.@Testvoid calculateTotalPrice() { CafeKiosk ca.. 이전 1 2 3 4 5 6 7 8 ··· 25 다음