inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

안녕하세요 코틀린으로 강의 수강 시 도메인 코드 질문드립니다

미해결

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

좋은 추석 보내고 계신가요? 현재 코틀린으로 강의를 따라해 보고 있습니다. class Member private constructor( val email: String, var nickname: String, var passwordHash: String, var status: MemberStatus, ) { fun activate() { check(status == MemberStatus.PENDING) { "회원이 PENDING 상태가 아닙니다" } this.status = MemberStatus.ACTIVATE } fun deactivate() { check(status == MemberStatus.ACTIVATE) { "회원이 ACTIVE 상태가 아닙니다" } this.status = MemberStatus.DEACTIVATED } fun verifyPassword( password: String, passwordEncoder: PasswordEncoder, ): Boolean = passwordEncoder.matches(password, this.passwordHash) fun changeNickname(nickname: String) { this.nickname = nickname } fun changePassword(password: String) { this.passwordHash = password } companion object { fun create( email: String, nickname: String, password: String, passwordEncoder: PasswordEncoder, ): Member = Member( email, nickname, passwordEncoder.encode(password), MemberStatus.PENDING, ) } } 이러한 식으로 작성하였는데 자바에서는 const로 선언한 객체나 변수가 아닌 이상 기본적으로 가변입니다. 그런데 코틀린에서는 val, var 키워드에 따라서 var로 선언해야 가변 타입이 됩니다. Member 도메인 모델 확장 챕터 수강하고 있는데 이 경우는 도메인에서 가변 속성을 미리 정의하고 해당 속성들을 var로 선언하는 것이 맞을지, 혹은 val을 통해 불변성을 확보하고 새 객체를 생성하여 변경을 처리하는 것이 적합할지 궁금합니다. 코틀린에서 도메인 코드를 작성할 때 자바와 다른 문법&개념과 도메인 중심 설계가 종종 난해할 때가 있네요.

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
  • kotlin
정라잇 댓글 2 좋아요 0 조회수 109

내부 설계에 의존하는 테스트 관련 질문 드립니다.

미해결

Spring Boot TDD - 입문부터 실전까지 정확하게

강의를 들으면서 내부 설계에 의존하는 테스트라는 것이 무엇인지 조금 헷갈려서 질문 드립니다. 강의 초반에는 테스트가 내부 설계에 의존해서는 안된다고 말씀 주셨습니다. 내부 설계에 의존하게 되면 테스트가 깨지는 등의 부작용이 발생할 수 있기 때문이라는 점도 함께 말씀 주셨는데, 이번 강의에서는 내부 설계에 의존해야 하는 케이스를 설명 해주셨습니다. 다만 왜 이런 케이스에는 내부 설계에 의존해야 하는지를 확실하게 이해를 하지 못했습니다. 조금 더 자세한 질문을 드리자면 내부 설계의 의미 내부 설계에 의존해야 하는 이유 이 두가지를 잘 이해하지 못한 것 같습니다. 내부 설계라는 것이 클라이언트가 실제로 사용하는, 외부로 공개된 인터페이스를 제외한 모든 부분을 말하는 것일까요? 이번 강의에서 내부 설계에 의존해야 하는 이유는 클라이언트는 어떤 방식으로 암호화를 하는지 알 필요가 없다. 하지만 현재 공개된 인터페이스로는 실제 비밀번호가 평문으로 저장이 되었는지, 아니면 정말 암호화가 이루어져 저징이 되었는지를 확인할 수 있는 방법이 없다. 그러므로 실제 암호화 로직을 테스트 해야한다 (내부 설계에 의존해야 한다) 정도로 이해했습니다만 제가 맞게 이해한 것인지 감이 오질 않습니다. 요약하자면 내부 설계란 외부로 드러난 인터페이스 외적인 것들을 말하는 것인지 왜 내부 설계를 의존해야만 하는 상황이 발생하는지 정도일 것 같습니다. 감사합니다.

  • tdd
  • spring-boot
  • 아키텍처
  • junit
counterchord89 댓글 2 좋아요 1 조회수 119

멀티모듈에서 DB 커넥션 풀 분리

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

DataSource에 대한 질문 배치를 적용중인데, 멀티모듈에서 배치용 Application을 따로두고, 배치용 yaml에서 datasource를 두었고, api쪽도 yaml에서 datasource를 보고 있다. 이때 , 아래와 같이 Config에서 Bean을 통해 Datasource을 생성, JobRepository에 전달해주지 "않아도" 커넥션이 분리가 되는가? API 쪽 디비와, 배치 디비의 커넥션풀을 따로 쓰고싶은데 아래와 같이 별도 세팅 없이 yaml만으로 분리는 안되는지 궁금하다... @Configuration class JpaConfig { @Bean @ConfigurationProperties("spring.datasource") fun batchDataSource(): DataSource { return HikariDataSource() } @Bean fun jobRepository( batchDataSource: DataSource, transactionManager: PlatformTransactionManager, ): JobRepository { return JobRepositoryFactoryBean().apply { setDataSource(batchDataSource) setDatabaseType(DatabaseType.POSTGRES.name) setTransactionManager(transactionManager) afterPropertiesSet() }object } }

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
tjrwn0716 댓글 2 좋아요 1 조회수 109

스프링 DB연결

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 자바부터 강의를 듣고있는데 언어가 이해가 되는부분이 있고 안되는 부분이있는데 이거는 앞에가서 다시 학습을 하고와야하나요!? 지금 스프링입문은 여기서 다이해하고 다음 강의로 넘어가야 하는 건가요!?

  • java
  • spring
  • mvc
  • spring-boot
선일 댓글 1 좋아요 0 조회수 182

*가 아니가 article_id로 count를 뽑아줘야 할까요?

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

@Query( value ="select count(t.article_id) from ( " + " select article_id from article where board_id = :boardId " + "limit :limit " + ") t", nativeQuery = true ) Long count(@Param("boardId") Long boardId, @Param("limit") Long limit); 위와 같이 count(*) 가 아니라 count(t.article_id) 처럼 alias도 붙여야 하고, 모든 걸 뽑는 게 아니라 딱 서브쿼리 안에서 추출한 article_id만 count로 뽑아줘야 테스트가 통과되더라고요. 이유가 있을까요...?

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
Bruce Han 댓글 3 좋아요 0 조회수 121

오타 발견

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

SimpleStepHandler - Step 실행의 관리자 Step의 실행은 StepHandler에 의해 의해 통제된다. Spring Batch는 기본 구현체로 SimpleStepHandler를 사용하는데, 이 컴포넌트가 Step 실행의 전체 라이프사이클을 관리한다. 의해 의해 <- 그리고 Step Squad 핵심 요약 있으니까 너무좋은데 Job Squad 에서도 핵심요약이 있었으면 더 좋았을거같음 뭐 스탭이나 잡이나 내용이 거의 비슷비슷하긴한데(Execution 반드시 새거만들고,상태변경시 즉시 메타데이터저장소에 저장하고) 그래도 실제 실행 따라가는 느낌이라 정리가 잘 안되는느낌이긴해서 마지막에 방점찍으면 보기 더 편할거같은느낌

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
qwerty jon 댓글 3 좋아요 1 조회수 70

테스트 시나리오 관련 질문 드립니다.

해결됨

Spring Boot TDD - 입문부터 실전까지 정확하게

테스트와 코드간 성장 헙력 관계를 보면서 문득 궁금증이 들었습니다. 테스트 시나리오는 작성하면서 시나리오의 순서 역시도 중요하지 않을까? 하는 의문이 들었습니다. 단순한 기능들은 (예시로 들어주신 회원가입)은 테스트 시나리오의 순서에 큰 영향을 받지 않을 것 같으나 좀 더 복잡한 로직, 예를 들면 금액 계산과 같은 로직은 테스트 시나리오를 작성함에 있어서 순서를 신경 써야 할까요? 좋은 예시가 떠오르지는 않지만 예약 시스템을 만들면서 테스트 시나리오를 짠다고 했을 때 테스트 시나리오의 순서대로 코드가 성장이 된다고 가정하면 테스트 시나리오를 작성하는 순서 역시도 중요한 부분 중 하나일 수 있겠다는 생각이 들었습니다. 강사님은 테스트 시나리오를 작성 하실 때 순서를 크게 신경 쓰지 않으시나요? 아니면 로직의 흐름을 미리 어느정도 파악해 두시고 시나리오를 그 흐름에 맞춰 작성하시나요? 두서 없는 질문이라 정말 죄송합니다.

  • tdd
  • spring-boot
  • 아키텍처
  • junit
counterchord89 댓글 2 좋아요 1 조회수 125

13분쯤 테스트하다가 안 된다면?

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

저도 13분쯤에 create 테스트를 하다가 안 되어서 삽질했는데, 드디어 됐습니다. 원인은 createdAt, updatedAt에 값을 설정하지 않고 넣으려다 보니, null로 들어가서 에러가 발생했던 것이었습니다. 그리고 mysql에 접속했을 때는 use article; 로 DB에 접근해야 합니다. 저는 use database; 로 접근하고 있었네요. 이 과정에서 GPT의 도움을 많이 받았습니다. 13분쯤 진행다가 나오던 그 500 에러 로그는 애플리케이션을 확인해 봐야 하고요. 테스트 코드의 create 메서드에는 IDE의 설명도 같이 참고했습니다. 왜 오류가 떴는지 알려주더군요.

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
Bruce Han 댓글 2 좋아요 0 조회수 99

@SpringBootTest 어노테이션의 classes 관련 질문 드립니다.

해결됨

Spring Boot TDD - 입문부터 실전까지 정확하게

@SpringBootTest 어노테이션에 classes를 사용해 CommeceApiApp.class를 구체적으로 지정하시는 이유가 있으실까요?

  • tdd
  • spring-boot
  • 아키텍처
  • junit
counterchord89 댓글 2 좋아요 1 조회수 93

writer retry 관련해서 궁금한 점이 있습니다.

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

반말은 조금 부끄러워서.. 존댓말로 질문드리겠습니다. ItemWriter에서 예외 발생 시 재시도 - 청크 단위로 재시도 관리 1. ItemWriter에서 예외 발생 시 ItemProcessor부터 처리가 재개된다. 2. ItemProcessor에서와 달리, ItemWriter에서의 재시도 횟수는 청크 단위로 관리된다. 요 부분에서 실제로 배치를 돌려보니 writer부터 재시작하는 것을 확인 가능했습니다.. 관련해서 원인을 분석해보니, 아래 결론에 도달했는데 맞을까요? processorNonTransactional() 설정이 켜져있으면 Item 단위로 처리 결과를 캐시에 저장하기때문에 processor는 모두 완료 처리 -> writer부터 시작 processorNonTransactional() 설정이 꺼져있으면 청크 단위로 완료 처리하기때문에 processor부터 다시 시작

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
박정선 댓글 2 좋아요 1 조회수 86

청크 지향 처리 시 벌크 read 방법?

해결됨

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

킬구형, 청크 지향 처리 시 벌크 read를 할 수 있는 방법이 있어? ItemReader 사용 시 소스에서 1건 씩 데이터를 읽어온다면, 단건 SELECT문이 매번 날아가거나 아니면 JDBC의 ResultSet next()를 사용하는 것 같은데,, 전자면 DB 부하가 너무 심하고 후자여도 네트워크 IO가 꽤 발생할 것 같은데.. 지금 수백? 수천만? 건 정도의 데이터를 마이그레이션 해야하는 업무를 받았는데, 청크 생성 시 DB 부하나 네트워크 트래픽을 좀 줄이고 싶은데 다건 SELECT를 통해 처리하는 방법이 있을까?

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
djccnt15 댓글 3 좋아요 2 조회수 150

마지막 헥사고날아키텍쳐 테스트

미해결

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

마지막 강의에서 진행한 헥사고날 아키텍처 테스트에서 저는 아래와 같이 에러가 발생하고 있는데 어떻게 수정을 해야 할까요? 소스 코드는 동일한 것 같은데... 무엇이 차이인지 모르겠어요 13:09:39.840 [Test worker] INFO com.tngtech.archunit.core.PluginLoader -- Detected Java version 17.0.12 Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of layer 'domain' ('com.inflearn.splearn.domain..') layer 'application' ('com.inflearn.splearn.application..') layer 'adapter' ('com.inflearn.splearn.adapter..') where layer 'domain' may only be accessed by layers ['application', 'adapter'] where layer 'application' may only be accessed by layers ['adapter'] where layer 'adapter' may not be accessed by any layer' was violated (1 times): Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19) java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of layer 'domain' ('com.inflearn.splearn.domain..') layer 'application' ('com.inflearn.splearn.application..') layer 'adapter' ('com.inflearn.splearn.adapter..') where layer 'domain' may only be accessed by layers ['application', 'adapter'] where layer 'application' may only be accessed by layers ['adapter'] where layer 'adapter' may not be accessed by any layer' was violated (1 times): Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19) at com.tngtech.archunit.lang.ArchRule$Assertions.assertNoViolation(ArchRule.java:94) at com.tngtech.archunit.lang.ArchRule$Assertions.check(ArchRule.java:86) at com.tngtech.archunit.library.Architectures$LayeredArchitecture.check(Architectures.java:347) at com.inflearn.splearn.HexagonalArchitectureTest.hexagonalArchitecture(HexagonalArchitectureTest.java:22) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.tngtech.archunit.junit.internal.ReflectionUtils.invoke(ReflectionUtils.java:111) at com.tngtech.archunit.junit.internal.ReflectionUtils.invokeMethod(ReflectionUtils.java:103) at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:203) at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:173) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
inf025 댓글 2 좋아요 0 조회수 110

email과 패스워드 VO 질문이 있습니다.

미해결

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

안녕하세요 !! 도메인 모델의 값 객체 도입편에서 궁금한게 있습니다. 패스워드는 passwordEncoder를 의존하여 암호화와 매치 여부를 확인합니다. 이메일 vo는 검증 패턴이 member만 사용하는 것이 아니라 다른 곳에서도 사용할 수 있고 중복된 코드를 줄이기 위해서 변경하셨습니다. password도 이메일 vo처럼 매번 passwordEncoder를 주입받는 게 아니라 password VO를 만들어서 관리할 수 있을거같은데 패스워드는 의존성 주입으로 해결하게 되신 이유가 궁금합니다

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
티벳로보 댓글 2 좋아요 0 조회수 114

redis 샘플 공격 데이터 2번 오류

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

오타 발견 root@4ea86c29f1f7:/data# redis-cli set attack:2 "{\"id\":2,\"timestamp\":\"${TODAY}T09:28:47\",\"targetIp\":\"203.0.113.50\",\"attackType\":\"XSS\",\"payload\":\"<script>alert('HACKED!');</script>\"}" 위 명령어 실행 시, 아래와 같은 에러 메시지 발생! bash: !': event not found 에러 발생 원인 bash: !': event not found 에러는 Bash의 히스토리 확장(history expansion) 때문에 납니다. ! 문자(예: HACKED! )가 들어가면 bash가 ! 로 시작하는 히스토리 토큰(예: !! , !$ , !123 )으로 해석하려 하고, 매칭되는 히스토리 항목이 없으면 event not found 오류가 납니다. set +H # 히스토리 확장 끄기 ... redis-cli set attack:2 "{\"id\":2,\"timestamp\":\"${TODAY}T09:28:47\",\"targetIp\":\"203.0.113.50\",\"attackType\":\"XSS\",\"payload\":\"<script>alert('HACKED!');</script>\"}" ... set -H # # 히스토리 확장 켜기 OK redis key들을 set 하기 전에 히스토리 확장을 끄고 실행할 경우 정상 동작

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
kiljw316 댓글 2 좋아요 1 조회수 78

MR.kill-9 첫번째 예제 코드 실습하면서 궁굼한점이 생겼다.

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

강의 예제를 따라가면서 SystemFailureJobConfig 배치를 실행했는데, 계속 FlatFileItemReader에서 JobParameter로 전달한 inputFile이 null로 들어오는 문제가 발생했다. 정확하게는 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.item.file.FlatFileItemReader]: Factory method 'systemFailureItemReader' threw exception with message: Path must not be null 이 오류 였으며, public FlatFileItemReader<SystemFailure> systemFailureItemReader( @Value("#{jobParameters['inputFile']}") String inputFile) { log.info("오잉 Reader inputFile: " + inputFile); // null return new FlatFileItemReaderBuilder<SystemFailure>() .name("systemFailureItemReader") //여기서 path not null 오류 발생 .resource(new FileSystemResource(inputFile)) .delimited() .delimiter(",") .names("errorId", "errorDateTime", "severity", "processId", "errorMessage") .targetType(SystemFailure.class) .linesToSkip(1) .build(); } .name("systemFailureItemReader") 이 위치에서 발생하고 있었다. 그리고 line numbers are likely diverged. try to find the current location inside 'SystemFailureJobConfig. systemFaliureItemReader()' 이 메시지도 함께 보였다. GPT에 물어봐서 해결이 되긴 했는데, KillBatchSystemApplication에서 CommandLineRunner를 구현하고 직접 경로를 지정해주었다. @SpringBootApplication @AllArgsConstructor public class KillBatchSystemApplication implements CommandLineRunner { private final JobLauncher jobLauncher; private final Job systemFailureJob; public static void main(String[] args) { SpringApplication.run(KillBatchSystemApplication.class, args); } @Override public void run(String... args) throws Exception { JobParameters params = new JobParametersBuilder() .addString("inputFile", "/Users//Desktop/kill-batch-system2/system-failures.csv") .toJobParameters(); jobLauncher.run(systemFailureJob, params); } } 실무에서는 CLI로 파라미터를 전달하는것이 핵심이라 했던걸로 기억한다. CLI로 전달한 JobParameter를 StepScope Bean에서 안전하게 받는 다른 방법은 없나?? 아 지금 작업도구는 MacOS M1, Spring Boot 3.4.7 이다. 연휴 잘 보내길 바란다.

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
다온 댓글 3 좋아요 1 조회수 81

거짓 음성, 거짓 양성 관련 질문 드립니다.

해결됨

Spring Boot TDD - 입문부터 실전까지 정확하게

섹션 2 강의를 듣고 난 후 퀴즈를 푸는데 다음과 같은 문제가 나왔습니다. 소프트웨어 테스트에서 코드의 실제 문제는 있지만 테스트 결과는 성공으로 나타나는 오류 유형은 무엇일까요? 문제를 읽다보니 거짓 음성과 거짓 양성이 헷갈리기 시작했습니다. 시스템에 문제가 있으나(코로나 양성) 테스트(코로나 검사)는 시스템에 문제가 없다(코로나 음성)라고 나왔으니 거짓 음성이다. 라고 이해하면 되는 것일까요?

  • tdd
  • spring-boot
  • 아키텍처
  • junit
counterchord89 댓글 1 좋아요 1 조회수 117

청크 단위의 트랜잭션 롤백에 대한 질문

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

청크 단위로 트랜잭션 된다는건 이해했다. 그에 관련해서 궁금증이 생겼는데, reader, processor에서 처리하다가 Exception이 나도 사실 DB엔 롤백할게 없으니 사실상 Writer 작업 중에만 단 한번 롤백이 수행될 것이라고 예상되는데 맞는가? read 시에, process 도중에도 롤백이 일어날 경우가 있는지 궁금하다. 추가로 과거 스프링 배치 공식 문서의 잘못된 다이어그램 이라던지 null을 줘야 끝난다는 점과 97개 와 같이 자세한 예시를 들어준 점, read(), process()가 각각 10번씩 수행된다는 것과 같이 사용자들이 많이 헷갈려 하는걸 명확하게 알려줘서 좋은 것 같다.

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
tjrwn0716 댓글 2 좋아요 1 조회수 86

섹션5부터...

미해결

코드로 배우는 React 19 with 스프링부트 API서버

섹션5부터 자바 프로젝트가 완전 바뀌어 있는데 만들어야될 db정보도 없고... 어찌해야 할지 모르겠네요...

  • react
  • typescript
  • spring-boot
  • jpa
  • jwt
feelsagood 댓글 1 좋아요 0 조회수 100

[소셜 로그인 16강] 로그인 실패 시 리다이렉트 관련 질문

미해결

스프링 부트와 리액트로 구현하는 소셜 로그인

16강을 수강하고 있습니다. CustomLoginFailureHandler 사용자가 로그인에 실패했을 때 호출되는 메서드에 대한 질문입니다. if(savedRequest != null) { String targetUrl = savedRequest.getRedirectUrl(); //사용자가 접근하려던 URL // 즉, 로그인에 실패했지만 사용자를 원래 있던 페이지로 보내줌 // 실패 시 사용자가 접근하려던 URL 로그 출력 log.info("[핸들러 - 사용자가 접근 시도한 URL]\n-> " + targetUrl); // 사용자가 접근하려던 URL로 리다이렉트 (로그인 실패 후에도 이동) response.sendRedirect(targetUrl); } 그런데 if문의 마지막 줄을 보면 로그인 실패 후에도 targetUrl 즉, 사용자가 접근하려했던 페이지로 이동시킨다고 작성 되어 있는데 ... 로그인 실패 시에도 targetUrl로 리다이렉트시키는 이유가 뭔가요?? 로그인에 실패하면 로그인 페이지에 남아있어야 하는 것 아닌가요 ...?

  • react
  • java
  • spring-boot
  • jpa
  • spring-security
정수현 댓글 2 좋아요 0 조회수 106

[🔥응급🔥] 미스터 KILL-9 트랜잭션에 대해서 궁금한게 있다!

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

앞선 질문에 대한 답변 고맙다 미스터 KILL-9 덕분에 손쉽게 엑셀을 처형 (처리)할 수 있었지 하지만 그 다음 관문이 존재하는군 후후.. 각 STEP 마다 RepeatStatus 에 따라서 트랜잭션이 보장하는건 이해했다 하지만 여러 관계가 존재하는 테이블 데이터 적재 시 트랜잭션을 어떻게 보장할지 감이 안온다 미스터 KILL-9 예를 들어 설명하지.. FILE-A, FILE-B 각각 다른 컬럼을 가진 파일들이지 FILE-A는 TABLE-A에 적재하고 FILE-B는 TABLE-B에 적재한다 각 FILE 당 ROW 100개씩 읽으면서 적재하고 문제가 생기면 해당 100건만 롤백할텐데 문제는 TABLE-A 와 TABLE-B의 관계다 TABLE-A 가 부모고 TABLE-B자 자식 테이블인 상황에서 특정 TABLE-B 데이터 롤백 시 TABLE-A 데이터도 마찬가지로 롤백 해야할거 같은데 이런 경우 어떻게 원자성을 보장할 수 있는가에 답변할 수 있겠는가..? 현재 내가 떠오른 방안은 결국은 모든 데이터 처리이니 특정 부분 처리 실패하면 데드 DLQ (Dead Letter Queue) 에 담아서 나중에 처형( 처리)하도록 해야하나 싶다!

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
wndgks49 댓글 1 좋아요 1 조회수 79

인기 태그

인프런 TOP Writers

주간 인기글