묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
마지막 헥사고날아키텍쳐 테스트
마지막 강의에서 진행한 헥사고날 아키텍처 테스트에서 저는 아래와 같이 에러가 발생하고 있는데 어떻게 수정을 해야 할까요? 소스 코드는 동일한 것 같은데... 무엇이 차이인지 모르겠어요 13:09:39.840 [Test worker] INFO com.tngtech.archunit.core.PluginLoader -- Detected Java version 17.0.12Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting oflayer '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 oflayer '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)
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
email과 패스워드 VO 질문이 있습니다.
안녕하세요 !! 도메인 모델의 값 객체 도입편에서 궁금한게 있습니다. 패스워드는 passwordEncoder를 의존하여 암호화와 매치 여부를 확인합니다. 이메일 vo는 검증 패턴이 member만 사용하는 것이 아니라 다른 곳에서도 사용할 수 있고 중복된 코드를 줄이기 위해서 변경하셨습니다. password도 이메일 vo처럼 매번 passwordEncoder를 주입받는 게 아니라 password VO를 만들어서 관리할 수 있을거같은데 패스워드는 의존성 주입으로 해결하게 되신 이유가 궁금합니다
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
redis 샘플 공격 데이터 2번 오류
오타 발견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 # # 히스토리 확장 켜기OKredis key들을 set 하기 전에 히스토리 확장을 끄고 실행할 경우 정상 동작
-
미해결3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]
6강 실컷 진행하다가 마지막 실행부분에서 안되요...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sqlMapClient' availableCaused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sqlMapClient' availableCaused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sqlMapClient' available --실행하면 404에러 뜹니다.
-
해결됨카카오 개발자와 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법 [ By. 비전공자 & Kakao 개발자 ]
코틀린
안녕하세요이번에 수강하려고 하는데 코틀린 한 번도 안 해봤는데 이 수업은 무리일까요?계속 자바만 사용했던 상태이고 아직 코틀린 배울 생각은 없는데 이 수업은 듣고 싶어서 여쭤봅니다 ㅠㅠ감사합니다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
MR.kill-9 첫번째 예제 코드 실습하면서 궁굼한점이 생겼다.
강의 예제를 따라가면서 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 이다. 연휴 잘 보내길 바란다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
청크 단위의 트랜잭션 롤백에 대한 질문
청크 단위로 트랜잭션된다는건 이해했다. 그에 관련해서 궁금증이 생겼는데,reader, processor에서 처리하다가 Exception이 나도 사실 DB엔 롤백할게 없으니 사실상 Writer 작업 중에만 단 한번 롤백이 수행될 것이라고 예상되는데 맞는가?read 시에, process 도중에도 롤백이 일어날 경우가 있는지 궁금하다. 추가로 과거 스프링 배치 공식 문서의 잘못된 다이어그램 이라던지null을 줘야 끝난다는 점과 97개 와 같이 자세한 예시를 들어준 점,read(), process()가 각각 10번씩 수행된다는 것과 같이사용자들이 많이 헷갈려 하는걸 명확하게 알려줘서 좋은 것 같다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
[🔥응급🔥] 미스터 KILL-9 트랜잭션에 대해서 궁금한게 있다!
앞선 질문에 대한 답변 고맙다 미스터 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)에 담아서 나중에 처형(처리)하도록 해야하나 싶다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
BatchConfig 에 대한 질문
Spring Boot + Kotlin + java 21로 진행중이다.먼저 좋은 강의 너무 고맙고,나도 다른 사람의 Q&A 처럼 BatchConfig가 있어서 수행시에 부트만 떴다가 꺼지고 아무것도 출력되지 않아서 당황했다 (그래서 강의 자료에 더이상 불필요하다 보다는 제거하라고 명시하면 좋을 것 같다)질문이 있는데1. BatchConfig가 있고 없고가 어떤 것 때문에 수행결과에 차이점을 주는거야?2. Kotlin을 사용한 Spring Boot에서는 @Import를 사용하지 않았는데, 이때도 자동으로 설정을 해주는걸까? BatchConfig가 있다는 것 자체로 배치 수행은 안하고 부트가 바로 끝나버려 두 질문 다 그냥 궁금증일 뿐이다. BatchConfig를 제거하면 수행에는 문제가 없다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
request-body-json
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강사님이 해당 서블릿 코드를 작설하실 때에는 response.getWriter().write("ok"); 만으로 postmant 테스트에서 200 ok 와 함께 response body에 ok가 찍히는걸 알 수 있습니다. 하지만 해당 코드로 제 로컬 pc에 실행을 해보니 다 동일하게 잘 전달이 되지만 response body에 아무것도 찍혀 있지 않습니다.그래서 코드를 response.setContentType("application/json"); response.getWriter().write("{\"status\":\"ok\"}"); 이런식으로 헤더에 본문 내용에 들어갈 타입을 선언하니 잘 출력이 되더라구요 여기서 궁금한점은 왜 차이가 나는가입니다.제가 아는 선에서는 따로 컨텐트 타입 설정을 안해주면 .getWriter().write()시에 text/plain 타입으로 나가는 걸로 알고 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
초반에 h2 다운로드 과정 꼭 필요한가요?
[질문 내용]초반에 h2 다운로드 과정 꼭 필요한가요? h2다운로드 과정 없이 h2의존성 주입 후 바로 application.yml or properties에 코드 입력하면 안되는지 궁금합니다.
-
미해결토비의 스프링 6 - 이해와 원리
템플릿 콜백 패턴 관련하여 궁금한 것이 있습니다!
안녕하세요 토비님! 좋은 강의 잘 듣고있습니다. 강의해주신 템플릿 콜백 + 전략 패턴을 보고 궁금한게 있어서 질문 드립니다. 현재는 config로 구현체의 빈을 직접 주입했지만, 데이터에 따라 동적으로 구현체를 선택해야할 때는 토비님은 어떤 방법을 주로 이용하시나요?
-
미해결실전! 스프링 데이터 JPA
하이버네이트6에서의 최적화에 이은 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]left join이 쿼리에 실어지지 않아 의문을 갖던 중https://inf.run/8ctRk 이 질문에 답변해주신걸 보고 이해했습니다. @Query(value = "select m from Member m left join m.team") Page<Member> findByAge(int age, Pageable pageable);결론적으로 위와 같이 하면 쿼리에 join문이 붙어 잘 나갑니다. 다만 count 쿼리는 여전히 아래와 같은데 이 부분도 역시 마찬가지로 하이버네이트6에서 count 쿼리에서 join 문을 알아서 빼서 최적화해준건가요?페이징 쿼리 select m1_0.member_id, m1_0.age, t1_0.team_id, t1_0.name, m1_0.username from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id order by m1_0.username desc fetch first ? rows only카운트 쿼리 select count(m1_0.member_id) from member m1_0
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
ExcelFileReader는 왜 존재하지 않는거지 미스터 킬구
킬구형 안녕 FlatFileReader 라는 아주 편안한 기능은 존재하는데 어째서 ExcelFileReader 기능은 존재하지 않는거지? gpt 말로는 공식 확장 모듈은 spring-batch-excel 이 존재한다고는 하는데 이거 믿고 사용해도 되는지 모르겠네 킬구형은 excel 파일 읽고 DB에 쓸 때 아파치 poi 라이브러리로 직접 파싱해?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
오타발견
그러나 JdbcCursorItemReader는 기본적으로 커서의 순반향 이동만 지원순반향->순방향근데 맨날 오타글만 올리는데 괜찮음?귀찮으면 안하고
-
해결됨백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오
“외부 API” 호출이 실패한 경우 “내 서비스” DB 데이터의 정합성은 어떻게 되나요?
안녕하세요 딩코딩코님! 수업 감사히 듣고있습니다!아래 코드에서 트랜잭션 범위를 최소화하기 위해 1. 기존 서비스로 이벤트 참가 처리 메서드에만 @Transactional이 붙여져 있습니다.이미 커밋이 된 상태이기 때문에, 2. 외부 API 호출이 실패해서 RuntimeException 예외를 던져도 “내 서비스”의 DB에는 “참가자 수 증가”와 “참가자 정보 저장”이 된 상태일 것으로 생각되는데,이 경우, 아래 두가지 옵션 중 선택하는 것이 좋은 방법인지트랜잭션 범위를 2. 까지 늘린다.외부 API 호출 실패 시 “참가자 수 감소”, “참가자 정보 삭제” 로직을 추가한다.아니면, 더 좋은 옵션이 있는지 궁금하여 질문드리게 됐습니다!public class ImprovedEventJoinWithExternalApiUpdateFacade { private static final String TEST_PHONE_NUMBER = "01012341234"; private final EventExternalUpdateService eventJoinService; private final ExternalEventApi externalEventApi; private final ApplicationEventPublisher eventPublisher; public void joinEvent(Long eventId, Long memberId) { // 1. 기존 서비스로 이벤트 참가 처리 EventWithLockParticipant participant = eventJoinService.joinEventWithTransaction(eventId, memberId); // 2. 외부 API 호출 ExternalEventResponse response = externalEventApi.registerParticipant( eventId, memberId, participant.getEvent().getName() ); if (!response.isSuccess()) { throw new RuntimeException("외부 API 호출 실패: " + response.getErrorMessage()); } // 3. 외부 API 응답으로 참가자 정보 업데이트 eventJoinService.updateExternalId(participant, response.getExternalId()); // 4. 이벤트 발행 (트랜잭션 커밋 후 실행됨) eventPublisher.publishEvent(new EventJoinCompletedEvent( eventId, participant.getEvent().getName(), TEST_PHONE_NUMBER )); } }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
저는 application.yml 파일에서 mysql username 과 password 를 전부 .env 파일에 넣고 $ {} 를 써서 나타냈습니다. 그래서 .env 파일은 깃허브에 올리면 안돼서 배포해도 제대로 안돌아갈것 같아서 그런데. 혹시 강사님께서는 aws 배포하실때 db username, password 와 같은 민감한 정보들은 어떻게 처리하여 배포하시는걸 추천드리나요?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
오타?복붙실패
InFearLearn 서버 침입 사건: 해커 패턴 추적 작전작전 수행을 위한 실전 코드부터 살펴보자.여기코드에서 @Bean@StepScopepublic MongoCursorItemReader<SecurityLog> securityLogReader(이 아이템리더쪽 복붙하고 안다듬어서 들여쓰기 밀림
-
해결됨백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오
4-9 낙관적 락, 비관적 락
해당 강의 수강 중 Facade 패턴에 대해 알게 되었습니다 그런데 테스트 코드에만 Facade가 적용되어 있고 Controller에는 바로 서비스 코드를 호출하게 되어 있는데요. 학습용 예시 코드여서 이런 것인지 다른 의도가 있는것인지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
12:25
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]call AppConfig.memberService부분에서 sout순서가 call AppConfig.memberService->call AppConfig.memberRepository->call AppConfig.orderService->call AppConfig.memberRepository가 정상적인 예상 출력값아닌가요...?