Archive: 2022

0

Spring Batch - 04. JobLauncher

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing JobLauncher JobLauncher 인터페이스는 Job 을 실행시키는 역할을 한다 JobLauncher 는 Job 과 JobParameter 객체를 이용해 Job 을 실행한 후 JobExecution 객체를 반환합니다. JobLauncher를 사용하여 Job을 실행하면 Spring Batch가 Job의 모든 단계를 처리하고, 각 단계에서 발생한 모든 예외를 처리합니다. 또한 Job의 실행 상태를 추적하고 Job의 진행 상황 및 결과를 보고합니다. Spring Batch는 다양한 유형의 JobLauncher를 제공합니다. 각 JobLauncher는 다른 방식으로 Job을 실행하고 반환하는 JobExecution 객체의 속성이 다를 수 있습니다. 일반적으로 Spring Batch에서는 SimpleJobLauncher를 사용하여 Job을 실행합니다. SimpleJobLauncher는 가장 간단한 방식으로 Job을 실행하고 JobExecution 객체를 반환합니다.

0

Thread Safe

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) Thread Safe 란?Thread 는 프로세스와 다르게 프로세스 내부에서 할당 받은 자원을 공유 한다. 멀티 쓰레드 환경에서 한번에 공유 자원에 접근하는 Race Condition 이 발생해도 올바른 실행 결과가 나오게 보장함을 의미한다. Thread Safe 를 지키는 방법 Re-entrancy 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다. Thread Local Storage 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다. 이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다. Mutual Exclusion Thread에 Lock, Semaphore, Mutex 를 걸어서 공유자원에는 하나의 thread만 접근 가능하게 한다. Atomic operations 데이터 변경시 atomic하게 데이터에 접근하도록 만듭니다. Immutable Object 자바의 Final 처럼 객체를 생성한 후 수정이 불가능 하게 한다. Thread 동기화 실행 순서 에 따른 동기화 메모리 접근 에 대한 동기화 실행 순서에 따른 동기화 쓰레드의 실행 순서를 정하고 정해진 순서에 따라 작업을 처리하도록 한다.

0

Spring Batch - 03. Job

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing Job 이란 Batch 계층 구조에서 가장 상위에 있는 개념으로 하나의 Batch 작업 자체를 의미한다. Job Configuration 을 통해 생성되는 객체 단위로서 Batch 작업을 어떻게 구성하고 실행할지를 명세해 놓은 객체 Batch Job 을 구성하기 위한 최상위 인터페이스며 Spring Batch 가 기본 구현체를 제공한다. 여러 Step 을 포함하는 컨테이너로서 반드시 한개 이상의 Step 으로 구성돼야 한다. Spring Batch에서 Job은 하나 이상의 Step으로 구성된 일련의 작업 흐름을 정의하는 개념입니다. Job은 일괄 처리 작업의 논리적인 단위이며, 배치 작업을 실행하는데 필요한 모든 정보를 포함합니다. Job은 일괄 처리 작업을 실행하는데 필요한 다양한 설정을 제공합니다. 예를 들어, Job은 어떤 Step이 실행되어야 하는지, 어떤 파라미터를 사용해야 하는지, 어떤 예외 상황에 대처해야 하는지 등의 정보를 포함합니다. 또한 Job은 실행 순서, 종료 조건, 중지/재시작 가능 여부 등의 작업 흐름을 제어하는 데 사용됩니다. Spring Batch에서 Job은 JobBuilderFactory를 사용하여 생성됩니다. JobBuilderFactory는 JobBuilder 객체를 생성하고, 이를 사용하여 Job을 구성합니다. JobBuilder 객체를 사용하여 Job의 이름, 작업 수행에 필요한 Step, 파라미터 등을 정의할 수 있습니다.

0

Spring Batch - 02. Batch 에서 사용하는 Table

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing Spring Batch 메타 데이터 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters 등) 의 정보들을 저장, 업데이트, 조회할 수 있는 스키마 를 제공한다. 과거, 현재의 실행에 대한 세세한 정보, 실행에 대한 성공과 실패 여부등을 일목요연하게 관리함으로서 배치운용에 있어 리스크 발생시 빠른 대처 가능 DB 와 연동할 경우 필수적으로 메타 테이블이 생성 돼야 함 스키마 생성 설정 수동 생성 : 쿼리 복사 후 직접 실행 자동 생성 - spring.batch.jdbc.initialize-schema 설정 ALWAYS 스크립트 항상 실행 RDBMS 설정이 돼 있을 경우 내장 DB 보다 우선적으로 실행 EMBEDDED (기본 값) 내장 DB 일 때만 실행되며 스키마가 자동 생성됨 NEBER 스크립트가 항상 실행 안된다. 내장 DB 일 경우 스크립트가 생성이 안되기 때문에 오류가 발생 운영에서는 수동으로 스크립트 생성 후 설정하는 것을 권장 # ALWAYS 로 설정spring.batch.jdbc.initialize-schema: always# EMBEDED 로 설정spring.batch.jdbc.initialize-schema: embedded# NEVER 로 설정spring.batch.jdbc.initialize-schema: never

0

Spring Batch - 01. @EnableBatchProcessing

출처 해당 포스트는 정수원 강사님의 스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch 강의를 바탕으로 작성 됐습니다. 목차 Spring Batch - 14. 배치 초기화 설정 (application.properties) Spring Batch - 13. JobLauncher Spring Batch - 12. JobRepository Spring Batch - 11. ExecutionContext Spring Batch - 10. StepContribution Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블 Spring Batch - 08. Step Spring Batch - 07. JobExecution 와 JOB_EXECUTION 테이블 Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블 Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블 Spring Batch - 04. JobLauncher Spring Batch - 03. Job Spring Batch - 02. Batch 에서 사용하는 Table Spring Batch - 01. @EnableBatchProcessing @EnableBatchProcessing @EnableBatchProcessing 을 이용해 어플리케이션이 Spring Batch 로 실행될 수 있도록 자동으로 설정해준다. @SpringBootApplication@EnableBatchProcessing // Spring Batch 활성화public class SpringBatchApplication { public static void main(String[] args) { SpringApplication.run(SpringBatchApplication.class, args); }} Spring Batch 초기화 과정@EnableBatchProcessing 을 명시해주면 Batch 관련 설정 클래스 SimpleBatchConfiguration, BatchConfigurerConfiguration, BatchAutoConfiguration 를 실행시켜 Spring Batch 초기화 및 실행 구성이 이뤄진다.

0

Spring Data JPA - Convertor

목차 Spring Data JPA - 벌크성 수정 쿼리 Spring Data JPA - Convertor Spring Data JPA - Auditing Spring Data JPA - Paging Request Paramater Spring Data JPA - 페이징과 정렬 Post not found: spring/spring-data-jpa/07-spring-data-jpa Spring Data JPA - 반환 타입 Spring Data JPA - Query 파라미터 바인딩 Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기 Spring Data JPA - JPQL (Java Persistence Query Lange) 사용하기 Spring Data JPA - 메소드 이름으로 쿼리 생성하기 Spring Data JPA - 시작하기 BooleanToYNConverterBoolean 으로 저장 되는 값을 True, false 로 변경해 값을 저장하기 위한 Convertor @Converterpublic class BooleanToYNConverter implements AttributeConverter<Boolean, String> { @Override public String convertToDatabaseColumn(Boolean attribute){ return (attribute != null && attribute) ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String dbData){ return "Y".equals(dbData); }} @Entity@Getter@Builder@NoArgsConstructor@AllArgsConstructor@EntityListeners(AuditingEntityListener.class)public class Post extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column private Long id; @Column(name = "POST_TITLE", length = 100, nullable = false) private String title; @Column(name = "POST_SUBTITLE") private String subTitle; @Lob private String content; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "username", nullable = false, referencedColumnName = "username") @CreatedBy private UserInfo author; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CATEGORY", nullable = true, referencedColumnName = "CATEGORY_NAME") private Category category; @Column(name = "isDeleted") @ColumnDefault("false") @Convert(converter = BooleanToYNConverter.class) private boolean isDeleted; // ==== 연관관계 편의 메서드 ==== // public void changeCategory(Category category){ this.category = category; // 새로운 카테고리에 해당 포스트 추가 category.getPosts().add(this); } public void setAuthor(UserInfo author){ this.author = author; author.getPosts().add(this); } public Post updatePost(Post post) { this.title = post.title; this.subTitle = post.subTitle; this.content = post.content; changeCategory(post.getCategory()); return this; }}

0

Spring boot - 메시지 국제화 MessageSource

목차 Post not found: spring-boot/spring-framework/springboot-actuator Post not found: spring-boot/spring-framework/springboot-messageresource Post not found: spring-boot/spring-framework/configuration/springboot-WebMvcConfigurer Post not found: spring-boot/spring-framework/configuration/springboot-autoconfiguration 참고 https://gist.github.com/dlxotn216/cb9fe1e40c7961da9d7147d9ebc876d6 메시지 관리를 위한 MessageSource어플리케이션 개발을 진행하다가 보면 메시지를 보낼때 하드 코딩으로 넣다 보면 같은 맥략으로 쓰인 메시지들이 서로 상이하게 관리되는 것을 느낄 수 있었고 무엇보다 가장 큰 문제는 메시지를 변경하게 될 경우 해당 메시지가 사용된 소스를 전부 찾아 변경해 줘야 하는 문제점이 있다. 이런 메시지 파편화를 막고 한 곳에서 모든 메시지를 관리할 수 있도록 Spring 에서는 MessageSource 를 제공한다. MessageSource 메시지를 한 파일 message.properties 에서 관리할 수 있다. 경로 : main/resource/message.properties 메시지에 대한 다국어 처리 를 지원한다. 사용법 : message_[언어코드].properties 영어 : message_en.properties 한국어 : message_ko.properties 메시지 등록 경로 : main/resource/message.properties

0

Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고 https://www.baeldung.com/spring-security-5-oauth2-login https://www.docs4dev.com/docs/en/spring-security/5.1.2.RELEASE/reference/jc.html#oauth2client OAuth2LoginAuthenticationFilter OAuth2 인증을 진행하기 위한 Filter OAuth2 인증 방식도 UsernamePassword 인증과 같이 인증을 진행하기 위한 Filter 가 존재한다. OAuth2LoginAuthenticationFilter 에서는 Authentication Server 로부터 Authorization Code 를 받은 후 Acess Token 과 Reflesh Token 을 받기 위한 과정을 진행한다. ClientRegistrationRepository ClientRegistration 정보를 저장 및 가져오기 위한 Class OAuth2AuthorizedClient 인증된 Client 정보를 관리하기 위한 Class Access Token, Reflesh Token, ClientRegistration 정보를 관리하는 Class OAuth2AuthorizedClientRepository OAuth2AuthorizedClient 정보를 저장 및 가져오기 위한 Class 인증이 진행중인 Client 정보를 가져온다. 기본 구현체는 HttpSessionOAuth2AuthorizedClientRepository OAuth2AuthorizedClientService Application Level 에서 OAuth2AuthorizedClient 정보를 가져오기 위한 Class 인증이 완료된 Client 정보를 저장소 에서 가져올 때 사용한다. 메모리에 OAuth2AuthorizedClient 객체를 저장하는 InMemoryOAuth2AuthorizedClientService 데이터 베이스에 OAuth2AuthorizedClient 객체를 저장하는 JdbcOAuth2AuthorizedClientService AuthorizationRequestRepository 인증 요청에서 인증 응답을 받을때 까지 OAuth2AuthorizationRequest 의 지속성을 보장하기 위한 Class 기본 구현체는 Session 에 저장하는 HttpSessionOAuth2AuthorizationRequestRepository OAuth2AuthorizationRequestResolver registrationId 와 HttpServletRequest 를 OAuth2AuthorizationRequest 객체를 생성하기 위한 Class 기본 구현체는 DefaultOAuth2AuthorizationRequestResolver OAuth2AccessTokenResponseClient Authorization Code 를 Access Token 으로 교환하는데 사용하는 Class 기본 구현체는 DefaultAuthorizationCodeTokenResponseClient 인증 과정

0

컴퓨터 구조 - 메모리 관리 Paging 기법

Paging 기법 프로세스가 사용하는 메모리를 일정한 크기로 잘라 메모리에 할당 하는 방식, 기존 논리 주소 공간이 하나의 연속된 물리 주소 공간에 들어가야 하는 제약을 해소하기 위해 생긴 방식 프로세스의 주소 공간을 나누는 단위는 page, 메모리를 나누는 단위는 frame 이라 한다. page 와 frame 의 크기는 항상 같다. 메모리에 프로세스 주소 공간 전체를 올릴 필요가 사라졌다. 연속된 메모리로 관리하지 않기 때문에 Page Table 을 이용해 여러개로 나뉜 Page 정보를 관리한다. 외부 단편화 가 발생하지 않지만 내부 단편화 가 발생하게 된다. Page Table Virtual Page Number 를 Physical Frame Number 로 변환 시켜주는 Mapping 정보와 현재 Memory 적재 여부를 확인할 수 있는 Table MMU(Memory Management Unit) 는 Page Table 정보를 이용해 논리 주소를 물리 주소로 변환시킨다. Page Table 을 프로세스 마다 하나씩 존재하고 메모리에 올라가 있다. 실행된고 있는 프로세스가 많을 수록 메모리에 올라가 있는 Page Table 정보도 많게 된다. Page Fault Page Fault 란 프로세스가 요청하는 Page 정보가 현재 Memory 에 없는 경우를 뜻한다.

0

컴퓨터 구조 - 메모리 관리 Segmentation 기법

Segmentation 기법 Paging 기법과 달리 프로세스가 사용하는 메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할 하고 메모리에 할당하는 기법 Segmentation 은 프로세스를 세그먼트(code, data, stack)의 집합으로 보고 의미가 같은 논리적 내용 단위로 자른다. 자르는 방식에서의 차이가 있고, 메모리에 할당하는 방식은 Paging 과 같다. Segmentation 은 Segmentation Table 을 이용해 여러개로 나뉜 Segment 들을 관리 한다. Paging Table 과의 차이는 Segmentation Table 은 서로 다른 크기로 나뉘었기 때문에 Limit 정보도 같이 관리된다.

0

Spring Security OAuth2 - Handler

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고Success Handler 만들기Oauth2 인증 후 특정 작업을 진행하기 위해서는 SuccessHandler 가 필요하다. AuthenticationSuccessHandler 를 구현해 인증 후 사용자 정보를 로그로 출력하는 Handler 를 만들어 보려고 한다. 인증 후 Authentication 객체 내 Principal 에는 OAuth2User 객체 정보가 들어가게 된다. (OAuth2LoginAuthenticationProvider 에서 확인) @Slf4jpublic class Oauth2AuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal(); log.info("oAuth2User name = {}", (String) oAuth2User.getAttribute("email")); log.info("oAuth2User name = {}", (String) oAuth2User.getAttribute("name")); }} Security Config 추가oauth2AuthenticationSuccessHandler Bean 을 생성 후 successHandler 에 추가한다.

0

Spring Security OAuth2 - Login 페이지 Customizing 하기

목차 Spring Security OAuth2 - Handler Spring Security OAuth2 - Login 페이지 Customizing 하기 Spring Security OAuth2를 이용한 로그인 구현 - 사용자 정보 가져오기 Spring Security OAuth2를 이용한 로그인 구현 - Spring boot OAuth2 인증 살펴보기 Spring Security OAuth2를 이용한 로그인 구현 - OAuth2를 이용한 인증 사용하기 Google OAuth2 인증 방식 이해하기 OAuth2를 이용한 로그인 구현 이해하기 참고 https://www.baeldung.com/spring-security-5-oauth2-login Security Config@EnableWebSecurity@Slf4jpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth_login") .permitAll() .anyRequest() .authenticated() .and() .oauth2Login() .loginPage("/oauth_login"); }} Controller@Controllerpublic class LoginController { private static String authorizationRequestBaseUri = "oauth2/authorization"; Map<String, String> oauth2AuthenticationUrls = new HashMap<>(); @Autowired private ClientRegistrationRepository clientRegistrationRepository; @GetMapping("/oauth_login") public String getLoginPage(Model model) { Iterable<ClientRegistration> clientRegistrations = null; ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository) .as(Iterable.class); if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) { clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository; } clientRegistrations .forEach(registration -> oauth2AuthenticationUrls .put(registration.getClientName(), authorizationRequestBaseUri + "/" + registration.getRegistrationId()) ); model.addAttribute("urls", oauth2AuthenticationUrls); return "oauth_login"; }} 로그인 페이지

0

Spring Test - @WithMockUser, @WithAnonymousUser

목차 Spring Test - @WebMvcTest Spring Test - @DataJpaTest Spring Test - @WithMockUser, @WithAnonymousUser Controller@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(){ return new String("hello"); }} @WithMockUser@WithMockUser 는 Security Test 를 진행할 때 인증된 Authentication 객체를 만들어 인증된 상태로 Test 를 진행할 수 있게 도와준다. 속성 username : Authentication 객체에서 사용할 username 을 설정 password : Authentication 객체에서 사용할 password 을 설정 roles : Authentication 객체에서 사용할 role 을 설정 authorities : Authentication 객체에서 사용할 authorities 을 설정 @WebMvcTest@AutoConfigureMockMvcclass HelloControllerTest { @Autowired MockMvc mockMvc; @Test @WithMockUser(username = "user", password = "1234") void mockUserTest() throws Exception { mockMvc.perform(get("/hello")) .andDo(print()) .andExpect(status().isOk()); }} @WithMockUser 권한 사용 하기

0

프로그래머스 - 양과 늑대 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스 - 양과 늑대 Cpp 문제 풀이이 문제의 가장 어려운 점은 한번 방문한 노드를 여러번 방문할 수 있다는 것이다. 중복을 허용한 탐색을 진행하면 탐색이 끝나지 않으므로, 최대한 중복 방문을 제거하기 위해 비트마스크 를 이용해 방문한 노드들을 관리하면서 같은 상태에서 같은 노드 방문을 못하게 하는게 이 문제의 핵심이다.그 다음으로 어려웠던 부분은 이 탐색의 끝은 항상 루트 노드에서 끝나야 한다는 점이고, 반대로 생각하면 루트 노드에서 탐색 가능한 범위만 정답이 될 수 있는 것이다. 처음에 이 부분을 염두하지 않아서 계속 틀렸다. 이 두 부분만 잘 염두 하면 이 문제를 해결하는데 큰 어려움은 없다. 전체 소스 코드#include <iostream>#include <string>#include <vector>using namespace std;int maxValue = 0;void dfs(int sheep, int woof, int start, int state, vector<int> info, vector<vector<int>>& grape, vector<vector<bool>>& check) { if (woof >= sheep) { return; } maxValue = max(maxValue, sheep); for (int i = 0; i < info.size(); i++) { int node = 1 << i; int isVisited = state & node; int nextState = state | node; if (grape[start][i] == 0) { continue; } if (check[nextState][i] == true) { continue; } check[nextState][i] = true; if (isVisited) { dfs(sheep, woof, i, nextState, info, grape, check); } else { if (info[i] == 0) { dfs(sheep + 1, woof, i, nextState, info, grape, check); } else { dfs(sheep, woof + 1, i, nextState, info, grape, check); } } check[nextState][i] = false; }}int solution(vector<int> info, vector<vector<int>> edges) { int answer = 0; vector<vector<int>> grape = vector<vector<int>>(info.size() + 1, vector<int>(info.size() + 1, 0)); vector<vector<bool>> check = vector<vector<bool>>((1 << 18) - 1, vector<bool>(17 + 1, false)); for (vector<int> edge : edges) { int from, to; from = edge[0]; to = edge[1]; grape[from][to] = 1; grape[to][from] = 1; } maxValue = 0; int state = 1 << 0; check[state][0] = true; dfs(1, 0, 0, state, info, grape, check); answer = max(maxValue, answer); return answer;}

0

Spring Test - @DataJpaTest

목차 Spring Test - @WebMvcTest Spring Test - @DataJpaTest Spring Test - @WithMockUser, @WithAnonymousUser @DataJpaTest JPA 테스트를 진행하기 위해 사용하는 어노테이션, JPA component 들만 관리하기 때문에 JPA test 시 관련된 Configuration 들만이 적용된다. 각 Test 를 진행할때마다 하나의 Transaction 에서 수행되고 Test 가 끝나면 Roll-back 을 진행한다. @Transactional 기능이 필요하지 않으면 @Transactional(propagation = Propagation.NOT_SUPPORTED) 설정 Test 진행시 Embedded In Memory Database 로 진행한다. @AutoConfigureTestDatabase 을 이용하면 Test 시 특정 Database 를 사용할 수 있다. @DataJpaTest 를 이용한 Test 코드 작성@DataJpaTestclass PostTest { @Autowired private PostRepository postRepository; @Test void createPostTest(){ String title = "title"; String subTitle = "subTitle"; String categoryName = "test"; String content = "content"; Category category = Category.builder() .name(categoryName) .build(); Post post = Post.builder() .title(title) .subTitle(subTitle) .category(category) .content(content) .build(); Post savedPost = postRepository.save(post); assertThat(savedPost.getTitle()).isEqualTo(title); assertThat(savedPost.getSubTitle()).isEqualTo(subTitle); assertThat(savedPost.getContent()).isEqualTo(content); }}