묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
강의 구매는 했는데
윈도우 유저는 불가능한 강의인가요?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
스프링 컨테이너 재시작 반복 현상
Jenkins를 바탕으로 Job들을 PipeLine으로 연결해서 사용중이다. Job들이 순차적으로 실행해야해서 아래처럼 파이프라인을 구성했다.pipeline { agent any stages { stage('Print Parameters') { steps { echo "=========================================" echo "🔧 Job Configuration" echo "=========================================" echo "startDate: ${params.startDate}" echo "endDate: ${params.endDate}" echo "pageNo: ${params.pageNo}" echo "numOfRows: ${params.numOfRows}" echo "=========================================" } } stage('Run abandonedAnimalDataLoadJob') { steps { script { echo "🐾 Starting abandonedAnimalDataLoadJob..." sh """ java -Duser.timezone=Asia/Seoul \\ -Dspring.profiles.active=local \\ -jar /var/jenkins_home/SeeYouAgain-Batch-0.0.1-SNAPSHOT.jar \\ --spring.batch.job.name=abandonedAnimalDataLoadJob \\ startDate=${params.startDate} \\ endDate=${params.endDate} \\ pageNo=${params.pageNo},java.lang.Long \\ numOfRows=${params.numOfRows},java.lang.Long """ echo "✅ abandonedAnimalDataLoadJob Completed!" } } } stage('Run s3ProfileUploadJob') { steps { script { echo "📤 Starting s3ProfileUploadJob..." sh """ java -Duser.timezone=Asia/Seoul \\ -Dspring.profiles.active=local \\ -jar /var/jenkins_home/SeeYouAgain-Batch-0.0.1-SNAPSHOT.jar \\ --spring.batch.job.name=s3ProfileUploadJob \\ startDate=${params.startDate} \\ endDate=${params.endDate} """ echo "✅ s3ProfileUploadJob Completed!" } } } } post { success { echo '=========================================' echo '✅ All Batch Jobs Completed Successfully!' echo '=========================================' } failure { echo '=========================================' echo '❌ Batch Job Failed. Please check the logs.' echo '=========================================' } always { echo "Pipeline execution finished at ${new Date()}" } } }로그를 찍어보니 스프링 컨테이너가 켜지고 첫번째 job이 끝난 후 컨테이너가 종료, 2번째 job을 실행하기 위해 스프링 컨테이너 켜지고 job이 끝난 후 컨테이너가 종료되는 비효율적인 현상을 발견했다. Claude한테 물어보니 job 실행시간이 짧아서 크게 문제없다고는 하지만, 개인적으로 Job이 많거나 추후에 오래 걸리는 Job이 추가될 경우엔 시간도 오래걸리고 리소스 낭비라고 생각한다. 이런 상황에선 어떻게 하는게 좋은가??
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
1장 작전 3 Listener 어노테이션 사용 사례 @Component 질문
어노테이션을 사용한 Listener 를 정의할 때 @Component 어노테이션으로 빈으로 등록시켜줬는데, 실제로 Listener 클래스를 지정할때는 new ServerRackControlListener() 로 직접 생성해주고있네?빈으로 등록한것과, 직접 생성한 것이 서로 연관되지 않는것 같은데 빈으로 주입받아서 넣어주는게 좋을까 아님 Listener 클래스를 빈으로 등록하지 않고 직접 생성해서 사용하는게 좋을까?배운대로 Listener 클래스에서 JobExecution 이나 StepExecution 을 사용하는데, Job 실행이나 Step 마다 Execution 이 다를 수 있으니까 빈으로 등록하지 않아도 될 것 같은데 어떻게 생각해?
-
해결됨프로덕션 레벨 실시간 채팅 서버 구축: 분산 처리부터 성능 최적화까지 (Kotlin & Spring)
웹소켓을 이용한 채팅시스템에서 부하테스트를 어떻게 진행해야할까요?
안녕하세요. 취준하고있는 예비 개발자입니다. 개인프로젝트를 진행하다가 여쭤보고 싶은게 있어 강의까지 구매하게 되었습니다. 가장 궁금한 질문은 '웹소켓을 이용한 채팅시스템에서 부하테스트를 어떻게 진행해야하는가?'입니다. 추가질문 및 부연설명을 위해 조금만 더 읽어주시면 감사하겠습니다. 현재 진행하고 있는 앱 개발 프로젝트 진행 중입니다.기술스택은 서버는 코틀린,스프링이고, 클라이언트는 iOS(swift)와 안드로이드(Kotlin)로 구성했습니다. http요청을 처리하는 서버(스프링 서버)는 단일 서버와 단일 데이터베이스로만 구성한 상황이고, 단일 인스턴스는 aws의 t2.micro를 이용하고 있습니다. 서버에는 nginx / next 서버(홍보용 홈페이지) / 스프링 서버 / github-runner 등의 프로세스가 실행 중에 있습니다. 클라이언트의 무한 재연결 로직의 문제로 인해 인스턴스 내부에서 'ss -s' 명령어를 이용해 소켓상태를 조회해본 결과, 소켓 tcp연결이 폭발적으로 증가하여 400개까지 증가한 상황이 있었습니다. 이 상황에서 소켓을 이용한 채팅뿐만 아니라 사용자 조회와 같은 http요청 모두 느려지는 것을 확인되었습니다. 하지만 재연결 로직을 수정하고 이후 tcp연결이 400(= 클라이언트 - nginx 200개 / nginx - 서버 200개)까지 증가하는 상황을 만들어봐야 또 문제가 발생하는지 확인할 수 있다고 생각했지만 200명의 테스터를 모을 수 없다고 생각했습니다. 또한, 채팅의 API를 하나 파고, ngrinder를 이용해 부하테스트를 요청하는 상황이 적합할까 생각했을 떄, 웹소켓 연결이 되지 않는 상황이라고 생각되어 적합하지 않다고 생각했습니다. 이런 상황에서 어떻게 테스트해볼 수 있을지 고민됩니다. 추가적으로 궁금한 점은앱 개발에서 채팅시스템을 구축하는 상황이고, 대략 500~1000명을 수용해야한다면 어떤 기술을 적용해 채팅시스템을 구축하셨을 것 같나요? 실시간 통신하면 웹소켓정도 밖에 모르는 상황이었기에 웹소켓을 적용했지만서도 타당했는가? 적합했는가에 대한 의문이 여전히 남아있는 상황이라고 생각하기 때문에 질문드렸습니다. t2.micro 서버는 얼만큼의 소켓연결까지 버틸 수 있는지 알고 싶습니다. 현재 서비스의 사전예약자가 80명 정도 되는 상황이라 t2.micro를 이용했을 때 서버가 터질까봐 우려스럽습니다. 그래서 서버 스펙을 확장을 고려하고 있는데, 취준생이기에 비용적인 측면에서 고려하지 않을 수가 없는 상황이라 '정말 확장하는게 맞을까?', '내가 능력이 부족한 게 아닐까?' 라는 생각이 들어 갈피를 못잡고 있는 상황이라 질문드렸습니다.제 질문들이 대부분 인프라 확장의 타당성을 갖추기 위한 질문이라고 생각합니다. 혹시 인프라 확장을 위한 근거로써 어떤 지표가 타당성을 확보할 수 있다고 생각하시는지 궁금합니다. 긴 질문 읽어주셔서 감사합니다.행복한 하루 되세요~
-
미해결Spring WebFlux + LLM 실전 구현
스케줄의 스레드를 최대한 사용하지 않고 WebFlux를 사용해야 되는 게 맞는지 궁금합니다.
안녕하세요. 강의 잘들었습니다.강의를 듣고나서 궁금한 점이 있어서요.WebFlux의 스케줄을 통해서 스레드를 분리해서 JPA를 사용한다고 봤고, 그리고 신뢰성이 떨어져도 괜찮은 데이터는 R2DBC를 사용한다고 보았습니다.그렇다면, 스케쥴의 스레드를 최대한 사용하지 않고 WebFlux에서 지원해 주는 컴포넌트를 사용하는게 최적이라고 생각되는데 맞을까요? 제 짧은 생각으로는 JDBC를 사용하면 결국에는 스레드 풀을 사용할 것이고, 사용자가 많아지면 많아질수록 스레드는 부족할 것이라고 생각이 돼서요. 이렇게 되면 WebFlux를 사용하는 이유가 점점 퇴색될 것 같다는 생각이 듭니다.그렇다면 제가 생각하기로는 WebFlux를 사용하면서 지원하는 컴포넌트(Netty가 지원해 주는 컴포넌트)를 잘 알고, 적절한 Stream 함수를 알고 사용하는 게 제일 중요하다고 생각되는데, 이게 맞는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
ai api 선정하기 관련 질문
안녕하세요!!! 제가 영한쌤의 강의를 토대로 백엔드개발을 배우고 팀원들과 프로젝트를 할려고 합니다.사용자들의 대화(텍스트)를 기반으로 여행계획을 짜주는 서비스를 만들려고합니다.사용자끼리 채팅->채팅내용을 ai api에 전송->여행계획출력순인데어떤 api를 사용하는게 좋을까요?제미나이 클로드 지피티 등 종류가 많아서 고민중입니다.
-
미해결스프링 시큐리티 OAuth2
authorization-server 라이브러리 질문이 있습니다.
강의 내에서 dependencies 하고 있는spring-security-oauth2-authorization-server 랑 아래 org.springframework.boot:spring-boot-starter-oauth2-authorization-server 과는 다른 라이브러리인가요?프로젝트 생성하면서 oauth2 authorization 서버를 선택 후에 build.gradle를 확인했는데강의에서 나온 것과 상이하여 질문드립니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락을 사용할 떄 차이점
@Version만 붙여도 자동으로 낙관적 락을 적용 시켜주는 걸로 알고 있습니다. 근데 강의에서는 @Lock(LockModeType.OPTIMISTIC) 을 이용해서 조회 시점부터 락을 거는 이유가 있을까요?@Lock(LockModeType.OPTIMISTIC) 를 제거하고 동시성 테스트 했을 떄도 정상적으로 돌아가긴 합니다. 어떤 차이가 있을까요
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
애그리거트의 repository
안녕하세요 토비님! 애그리거트를 사용할 때 질문 사항이 있습니다.예) A도메인 B도메인이 있다 A는 애그리거트 루트이고 B는 A의 부속 엔티티이다.A와 B는 일대다, 다대일의 양방향 의존성을 가진다.B는 A를 통해서만 조작될 수 있다.이 때 B를 생성하거나 업데이트 할 때 B의 repository는 어디에 존재해야 하는가?@Entity public class A { @OneToMany(mappedBy = "media", cascade = CascadeType.ALL, orphanRemoval = true) private List<B> bs = new ArrayList<>(); public void updateNumber(long n){ this.bs.stream().forEach(b -> b.update(n); } } @Entity public class B { @ManyToOne(fetch = FetchType.LAZY) private A a; private long number; public void update(long n){ this.number = n; } } 이렇게 되어 있다고 할 때 변경 가능성을 생각할 때(물론 엔티티에서 이미 jpa에 기술을 사용하고 있긴하지만) B의 repository를 따로 가지는게 맞나요? 만약 따로 가진다면 B의 repository가 A repository에서 의존하여 처리 되어야 하나요?jpa에 완전 종속적으로 사용하면 B가 따로 repository를 가질 필요 없는데 순수함을 유지하지 하려 하니 이 부분에서 고민이 되네요. 아니면 이런 고민 자체가 잘못된걸까요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
성능 측정시
이력서에 넣을 성능을 측정할 때단순한 쿼리 실행 속도나 API 응답 속도까지로컬이 아니라 aws에 띄워서 비교하는 게 좋을까요?
-
미해결코드로 배우는 스프링 웹 프로젝트 - Basic
강좌 만료 문의 22~24강
웹으로는 강의가 플레이되지만 앱에서는 22,23,24 강좌가 실행이 안되고 만료되었다고 하는데 확인후 조치 해 주세요.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
도메인 모델을 만들기 위해서는 Domain Expert에게서 듣고 배워야 한다고 말씀하셨는데, 이들의 정확한 역할이 잘 이해가 가지 않습니다.온라인 서점을 예로 들자면 제 머리속에 상상되는 Domain Expert는 실제 서점을 운영하는 사장님이 떠오르는데 강의에서는 회사에서 해당 일을 오랫동안 해 오신 분이나, 관련된 시스템을 개발해 본 경험이 있는 시니어 개발자 같은 사람을 Domain Expert라고 말씀 주셨습니다.그렇다는건 Domain Expert 라는 역할은 이 회사가 개발하고 있는 서비스를 가장 잘 알고 있는 사람 (그것이 개발자가 되었든, 디자이너, po와 같은 비 개발자가 되었든)이라고 이해해도 되는 것일까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]templates 에 css 추가하여 해결 했습니다. html 하위에 ~~~.html 파일들은 css 가 적용되어 열립니다.templates/baisc 하위 ~~~.html 은 이렇게 뼈만 앙상하게 나오는데 강의 에서는 templates 의 하위 html 파일에서도 css 폼이 적용 되어 나오는데 따로 설정 방법이나 변경 사항이 있는걸까요 ?<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <link th:href="@{/css/bootstrap.min.css}" href="../css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container" style="max-width: 600px"> <div class="py-5 text-center"> <h2>상품 목록</h2> </div> <div class="row"> <div class="col"> <button class="btn btn-primary float-end" onclick="location.href='addForm.html'" th:onclick="|location.href='@{/basic/items/add}'|" type="button">상품 등록</button> </div> </div> <hr class="my-4"> <div> <table class="table"> <thead> <tr> <th>ID</th> <th>상품명</th> <th>가격</th> <th>수량</th> </tr> </thead> <tbody> <tr th:each="item : ${items}"> <td><a href="item.html" th:href="@{/basic/items/{itemId}(itemId=${item.id})}" th:text="${item.id}">회원id</a></td> <td><a href="item.html" th:href="@{|/basic/items/${item.id}|}" th:text="${item.itemName}">상품명</a></td> <td th:text="${item.price}">10000</td> <td th:text="${item.quantity}">10</td> </tr> </tbody> </table> </div> </div> <!-- /container --> </body> </html>
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
오타(?) 발견
킬구형 3장. 작전1: 관계형 데이터베이스 읽고 쓰기 (테이블의 심장에 처형장을 세우다 ☠) 읽고있는데 뭔가 오타같은거 발견한거같아
-
미해결스프링 부트 - 핵심 원리와 활용
@Configuration 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]publicclass ImportSelectorTest { @Test void staticConfig() { AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(StaticConfig.class); HelloBean bean = appContext.getBean(HelloBean.class); assertThat(bean).isNotNull(); } @Test void selectConfig() { AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(SelectorConfig.class); HelloBean bean = appContext.getBean(HelloBean.class); assertThat(bean).isNotNull(); } @Configuration @Import(HelloConfig.class) publicstaticclass StaticConfig {} @Configuration @Import(HelloImportSelector.class) publicstaticclass SelectorConfig {}}안녕하세요. StaticConfig, SelectorConfig 클래스에 @Configuration 애노테이션은 어떤 모질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용]public class ImportSelectorTest { @Test void staticConfig() { AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(StaticConfig.class); HelloBean bean = appContext.getBean(HelloBean.class); assertThat(bean).isNotNull(); } @Test void selectConfig() { AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(SelectorConfig.class); HelloBean bean = appContext.getBean(HelloBean.class); assertThat(bean).isNotNull(); } @Configuration @Import(HelloConfig.class) public static class StaticConfig {} @Configuration @Import(HelloImportSelector.class) public static class SelectorConfig {}} 안녕하세요. StaticConfig, SelectorConfig 클래스에 @Configuration 애노테이션은 어떤 역할을 하나요? @Configuration 애노테이션을 주석 후 테스트를 해봤을 때 정상 동작하는 것까진 확인하였습니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
나중에 세션을 저장하고 꺼내는것도 나중 강의 에서 나오 나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 드립니다."로그인 처리하기 - 세션 동작 방식"을 보던 도중에 세션을 서버에 저장 했다가,꺼낸다는 사실을 알 수 있었습니다. 여기서 질문입니다. 나중 강의에서 (db가 포함된 강의에서) 세션을 넣다 빼는 것도 구현을 하는지 궁금해 집니다.혹 알려주시면 감사하겠습니다. 추가1이렇게 질문하게 된 이유는 들었고 이해는 되었는데 뭔가 애매해서 이쪽 부분 강의를 듣고 생각하다가 이런 생각을 하게 되었습니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
동시성 검증 코드에 관한 문의
안녕하세요. 동시성 검증 코드 관련하여 궁금한 점이 있어 문의드립니다.강의에서 ExecutorService를 사용하여 동시성 검증을 수행하신 것으로 보았는데, 이 방식만으로 실제 동시성 문제를 충분히 검증할 수 있을지 궁금합니다.컨텍스트 스위칭 타이밍에 따라 경합이 발생하지 않을 가능성도 있을 것 같습니다.예전에 면접에서 비슷한 질문을 받았는데, ExecutorService 기반 테스트만으로는 실제 운영 환경(수십만 건의 요청)에서 발생할 수 있는 동시성 이슈를 완전히 검증하기 어렵다는 지적을 받은 적이 있습니다.혹시 이러한 한계를 보완할 수 있는 다른 검증 방법이나 접근 방식이 있을까요?
-
미해결서버개발자 과제전형 완벽가이드 - 1편
Kotlin 테스트 프레임워크
안녕하세요🙂실무에서 만약 Spring과 Kotlin으로 프로젝트를 진행 했을 때 Spock로 테스트 코드를 짜도 상관이 없을까요?이번에 Kotlin으로 프로젝트를 진행해야하는 일이 생겼는데, 저 또한 강의에서 사용하신 Spock가 익숙해서 사용을 하려고 했는데, 보통 Kotest를 많이 사용하는 것 같아서요. 실무 관점에서 Java 대신 Kotlin을 사용한다면, 어떤 테스트 프레임워크를 선택하는것이 좋을지 궁금해서 질문드립니다. 감사합니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
회원 애플리케이션 서비스 테스트 (1)
회원 애플리케이션 서비스 테스트 (1) 12:46초 부분EmailSenderMock에 getter 어노테이션이나 메서드가 없는데 어떻게 getTos를 사용하신 걸까요..?
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
정적 팩토리 메서드 관련 질문드립니다!
안녕하세요 토비님 궁금한점이 생겨 질문을 남깁니다.예제를 진행하실때 정적팩토리 메서드를 통해 객체를 반환할때생성자를 통하지않고 바로 멤버변수에 값을 넣어 반환하는걸 사용하셨는데 public static Member register(MemberRegisterRequest createRequest, PasswordEncoder passwordEncoder) { Member member = new Member(); member.email = new Email(createRequest.email()); member.nickname = requireNonNull(createRequest.nickname()); member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password())); member.status = MemberStatus.PENDING; member.detail = MemberDetail.create(); return member; }이게 가능한 원리는 이해를 했습니다만 AI와 이야기하다보니 아래와 같은 이유를 제시하면서 생성자를 통한 반환을 강력 추천하더라구요부분 초기화 위험: 생성 직후 한동안 불완전 상태일 수 있어요. (중간에 예외가 나면 더더욱)final 을 못 씀: 생성자 밖 대입이 필요하니 final로 못 고정합니다(불변성/스레드 가시성 이점 상실).검증 누락 가능성: 검증/정규화가 흩어지기 쉬움 → 생성자 경로에 모으는 게 안전. 토비님 생각은 어떠하신지 궁금합니다.