묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
SQL 중심적 개발의 문제점에 대한 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 선생님 SQL 중심적 개발의 문제점에 대해 궁금증이 많아 글 남겨 봅니다. 선생님의 강의를 들으면서 결국 애플리케이션의 핵심 역할은 DB라는 종착지에 가기 전 데이터를 정제하고 그 정합성을 책임지는 것이라고 생각합니다. 애플리케이션이 이 책임을 다하려면, 데이터를 담는 DB설계에 끌려다는 것이 아닌 데이터를 가공하는 주체인 객체지향 설계가 우선되야 한다고 생각이 듭니다. 하지만 현실에서는 여전히 DB무결성을 이유로 DB설계를 최우선되고 객체는 그저 데이터의 운반책으로 쓰는 경우가 많았는데, 데이터 정합성의 책임을 다하기 위해 객체지향 설계가 DB설계보다 앞서야 한다는 제 생각이 맞는지 , 혹시 이런 관점이 실무에서 DB 무결성을 놓치는 위험한 발상은 아닌지 시니어 개발자이신 선생님의 고견을 듣고 싶습니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AOP 의존성 명칭 변경
스프링 부트 4.0부터 AOP 의존성 명칭 바뀌었으니 참고하세요. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide 4.0 이전implementation 'org.springframework.boot:spring-boot-starter-aop' 4.0 이후implementation 'org.springframework.boot:spring-boot-starter-aspectj'
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 여기까지 이해하신 내용은 무엇인가요? 2. 어려움을 겪는 부분어느 부분에서 막히셨나요?코드의 어떤 로직이 이해가 안 되시나요?어떤 개념이 헷갈리시나요? 3. 시도해보신 내용문제 해결을 위해 어떤 시도를 해보셨나요?에러가 발생했다면 어떤 에러인가요?현재 작성하신 코드를 공유해주세요 안녕하세요 항상 강의 잘 보고 있습니다 ! 딩코딩코님 혹시, 로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요? 서비스를 배포를 할 생각이긴한데, 똑같은 환경을 2개 만들어서 배포를 하고 테스트를 하려니 비용이 많이 나올 것 같아서 어떻게 해야될지 고민하고 있습니다 ㅜㅜ 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
데드락 발생 시, 외래 키를 제거하는 방법 관련 질문
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 4-8 여기까지 이해하신 내용은 무엇인가요?외래키 제약조건으로 인해 발생한 데드락 문제를 해결하기 위해 INSERT하려는 테이블에 외래 키를 제거한다. 2. 어려움을 겪는 부분외래키를 만약에 제거한다면, 어플리케이션 레벨에서 직접 관리한다고 했는데, 구체적으로 어떻게 관리를 하는 건지 궁금합니다!INSERT하려는 테이블과 연관된 테이블들을 먼저 조회(findXXX())를 하고, 만약에 없다면 예외를 발생시켜서 트랜잭션을 롤백시키는 방식으로 처리하나요? 실무에서 주로 어떻게 해결하는지 궁금합니다.그리고 외래키를 사용하지 않는 첫 번째 방법은 이미 테이블이 생성된 시점(INSERT하려는 테이블에 외래키가 추가되어 있는 상황)에서도 적용할 수 있는건가요?예를 들어, 이미 테이블에 데이터가 추가되어 있는 상황에서 첫 번째 방법을 적용하려면, 테이블 구조를 아예 바꿔야 할텐데 이 경우에는 두 번째 방법인 쿼리 순서를 바꾸는 걸 대안으로 사용하는 건가요?
-
미해결옆집 개발자와 같이 진짜 이해하며 만들어보는 첫 Spring Boot 프로젝트
DI 제가 이해한게 맞는지 궁금해요
강의에선 되게 단순하게 큰 틀 위주로 알려주시는 것 같아서 개인적으로 더 자세한 의미나 추가적인 개념이 궁금할 때 검색해보는 편인데, DI라는 것이 클래스 간의 결합도를 낮추고 객체의 유연성을 높이기 위해 빈 객체를 만들어 주입하는 것을 의미한다고 정리했습니다. 이게 맞게 정리한건지 궁금합니다. 또 추상 클래스와 인터페이스 간의 차이점은 찾아봐도 이해가 어렵길래 선생님의 친절한 설명이 필요할 것 같아서 추가로 여쭤봅니다!
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
MemberService와 EmailSender 책임 분리에 대한 질문
안녕하세요, 토비님. 강의 초반에 말씀해 주신 것처럼, 리팩토링 과정에서 “제가 했다면 어떻게 했을까”를 계속 생각해 보며 토비님의 의사결정 과정을 따라가고 있습니다. MemberService.register() 메소드에서 emailSender.send(...)를 sendWelcomeEmail()로 분리하시는 과정을 보며 두 가지 고민이 생겼습니다. 첫째, 환영 이메일의 내용이나 정책이 변경될 때마다 MemberService의 코드가 함께 변경되어야 한다면, 이는 SRP 위반에 해당하지 않는지에 대한 고민입니다. 이 경우 환영 이메일 전송에 대한 책임을 EmailSender 인터페이스 쪽으로 옮기는 것이 더 적절한지 궁금해졌습니다. 둘째, 만약 EmailSender 인터페이스에 해당 메소드를 추가한다면, 구현체가 늘어날수록 인터페이스가 비대해지거나 향후 구현 복잡도가 증가할 수 있다고 느꼈습니다. 이런 경우 default method로 제공하는 방식에 대해서는 어떻게 생각하시는지도 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
gradle 설정 안떠서 질문 남깁니다!
gradle이 왜 안뜨는지 모르겠습니다ㅠinvalidate caches도 다 밀어보고 oneDrive에서 파일도 꺼내고 .idea .gradle 폴더도 삭제하고 다시 빌드 했는데도 안뜹니다빌드는 잘되어서 잘 작동하는데 gradle 설정만 안뜹니다.2025.03 인텔리제이 버전이 문제인건가요?스프링 부트 4.0.2, 자바 ms OpenJDK 21 입니다. 플러그인 또한 spring 등등 모두 업데이트하고 재시작했는데도 안떠서 질문남깁니다!
-
해결됨스프링 핵심 원리 - 기본편
build.gradle로 프로젝트를 여는 이유
build.gradle로 프로젝트를 여는 이유가 무엇인가요?이때까지 저는 상위 폴더를 열었었는데 차이가 무엇인지 궁금합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
혹시 Containing 을 안쓰신 이유가 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이Like 검색에서 그냥 where like '%ㅁ%' 이렇게 앞뒤 같이 체크하는거면 그냥 Like 보다는 findByItemNameContaining 이렇게 Containing 을 쓰는게 더 맞을 거같은데 혹시 이걸 안쓰고 like 를 쓴 이유가 별도로 있을까요?!
-
미해결스프링 부트 - 핵심 원리와 활용
보안이 엄격한 데이터
보안이 엄격한 데이터(ex) db url, password, aws access/secret key, 관리자 id, password 등) 모두 properties/yaml 파일에서 관리해도 지장은 없을까요? 물론 gitignore에 해당 파일을 명시한다는 전제입니다.
-
미해결스프링 부트 - 핵심 원리와 활용
MyProperties 자체를 클라이언트 코드에서 사용
[질문 내용]여기에 질문 내용을 남겨주세요.행위가 없고, 아예 수정 불가한 읽기 전용 객체 타입인 경우, 별도의 MyDataSource 클래스를 Config 클래스에서 별도로 만들고 그것을 빈으로 등록하는 것보다 아예 MyDataSourceProperties 자체를 클라이언트 코드에서 사용하는 것이 좋을 것 같은데, 혹시 별로일까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.
수업자료 최신화좀 해주세요.pdf 자료 보면서 하다가 하다 하다 안되서 커뮤니티랑 찾다보니까 버전 안맞아서 설치 안되고 있엇네요.자료 최신화 하면 좋을것 같습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 3.X 버전 rendering, serializer 에러 해결 방법
질문은 아니지만, 타임리프 3.X 버전에서 발생하는 에러가 있어 공유 목적으로 글을 작성하였습니다.An error happened during template renderingcannot access a member of class hello.thymeleafbasic.basic.BasicController$User 타임리프 공식문서에 3.X 버전 부터 표현식에서 클래스 사용에 대한 더욱 엄격한 제한이 생겼다고 기재되었습니다. 따라서 기존 BasicController에서 User 클래스 코드 부분을 아래와 같이 변경하면 문제가 해결되는것으로 보입니다. // 접근 권한을 public으로 변경 @Data public static class User { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } } // 기존 @Data static class User { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } } 공식문서:https://www.thymeleaf.org/doc/articles/thymeleaf31whatsnew.htmlTighter restrictions on the use of classes in expressions
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
Batch 패키지 설계 — 실무에서 Job 단위 구조
킬구형 ㅎㅇ 요즘에 배치 다시 학습하면서 좀 고민인 부분이 있음. 현재 회사에서 배치 Job이 좀 많이 늘어나면서 코드 관리가 너무 어렵더라고. Spring MVC에서는 Controller-Service-Repository 같은 레이어드 아키텍처나 클린 아키텍처처럼 널리 쓰이는 구조가 있는데, 배치 쪽은 이런 패키지 구조나 설계 방식에 대한 레퍼런스가 상대적으로 적은 것 같아서. 최근에 클린 아키텍처를 배우면서 배치에도 이런 구조를 적용할 수 있는지 궁금해졌거든.지금 나는 대략 이런 식으로 구성하고 있어:batch/ ├── order/ │ ├── confirm/ │ │ ├── OrderConfirmJobConfig.java │ │ ├── OrderConfirmReader.java │ │ ├── OrderConfirmProcessor.java │ │ ├── OrderConfirmWriter.java │ │ └── OrderConfirmJobListener.java ├── payment/ │ ├── settle/ │ └── cancel/ ├── support/ ├── domain/ ├── application/ └── infrastructure/ 하나의 Job을 하나의 큰 애그리게이트처럼 보고 있어서, 관련 클래스를 패키지별로 분리하기보다 한 폴더 안에서 로우 레벨로 관리하는 게 더 편하더라고.근데 Job이 계속 많아질수록 이게 맞는 건지, 더 나은 방법이 있는 건지 잘 모르겠어서. 혹시 형은 실무에서 Job이 많아졌을 때 패키지 구조나 코드 구성을 어떻게 가져가? 객체 간 위계나 import 의존성 방향 같은 것도 신경 써서 설계하는지도 궁금해. 물론 사람마다 차이가 있겠지만 시간 괜찮으면 경험 공유해주면 도움이 많이 될 것 같아!
-
미해결스프링 부트 - 핵심 원리와 활용
http://localhost:8080/actuator/prometheus
http://localhost:8080/actuator 경로로 메트릭을 확인했을때 프로메테우스가 보이지가 않습니다. build.gradle에 코드 추가한 후 다시 빌드 했고 인텔리제이 외부라이브러리 안에 프로메테우스가 있는 것도 확인을 했습니다. 엑츄에이터 메트릭 노출도 모두 노출하도록 application.yaml에 코드도 잘 작성되어 있습니다. 무엇을 더 확인해야 할 지 모르겠습니다;;질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨3일 만에 끝내는 백엔드 면접 핵심 압축 공략집 [네카라쿠배당토]
강의평을 남겼는데 자료는 못 받는건가요?
dragonwaterr 로 인증까지 했는데 혹시 안도나요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.
1. 현재 학습 진도redis 2. 어려움을 겪는 부분 간단하게 제 프로젝트를 소개하자면 RSS피드를 통해 블로그의 글들을 불러와서 하나의 게시판에서 볼 수 있는 서비스 입니다.스케쥴러 작업에서 구독한 피드의 새로운 글들을 불러옵니다. 피드마다 비동기로 병렬 처리됩니다.이때 새로운 글인지 아닌지를 판단할 때 피드마다 redis를 사용하거나 피드마다 db의 조회를 통해 차이를 확인했는데 redis를 사용했을 때 빨라질 것이라 생각했지만 빠르지 않았습니다.3. 시도해보신 내용앞선 강의를 토대로 쿼리발생 횟수를 모니터링 횟수로 측정한 결과 피드가 100개일 경우 db의 조회를 활용했을 때 비동기 병렬 처리 되므로 100개의 select문이 나갑니다.redis를 사용했을 때는 0개의 select문으로 감소합니다. 하지만 성능은 비슷합니다.예상 가는 이유로는 redis를 사용했을 때 그 횟수가 너무 잦아서 redis에 연결하는 네트워크 시간 때문에 차이가 미미하다는 말이 있던 것 같습니다.만약 제 가설이 맞다고 한다면 redis를 사용할 때 항상 네트워크의 횟수를 최소화 해야만 redis의 성능을 온전히 이끌어 낼 수 있는건가요?보통 레디스를 사용할 때 이걸 다 생각하면서 1번만 redis가 조회 되도록 하고 생각하면서 쓰나요?그렇다면 제 코드에서 redis의 성능을 올바르게 나타내려면 피드의 새로운 글들을 하나의 List로 전부 묶은 후 redis에서 한번의 연결을 통해 한번에 캐싱을 확인해서 성능을 높여야 하는건가요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민
1. 현재 학습 진도부하테스트 2. 어려움을 겪는 부분부하 테스트의 코드를 통해 성능 개선 사례를 적으려고 합니다. 하지만 현재 평균 req_duration 즉 레이턴시가 너무 낮게 나옵니다. vus를 300으로 두었는데 아마 커넥션 풀이 모자라서 대기가 길어지는게 원인 같긴 합니다. 하지만 이걸 떠나서도 vus 300치고 너무 느리다고 판단되어서 이걸 개선했다고 포트폴리오에 쓰는게 의미가 있을지 걱정됩니다.또한 커넥션 풀이 모자라다고 대기업 개발자들이 항상 aws의 사양을 up시켜 커넥션 풀만 늘려서 해결하는 해결 방식을 사용하지는 않을 것 같은데 보통 성능 최적화를 통해 커넥션풀 점유를 짧게 해서 최대한 커넥션풀 고갈을 방지하는 방식으로 해결하나요?만약 그렇다면 성능 최적화 하는 방법에 부하를 분산하기 위한 kafka, redis, msa같은 기술들이 들어가는 건가요?마지막으로 성능 최적화를 포트폴리오 이력에 쓸 때 적절한 vus수가 궁금합니다 예를들어 면접관이 봤을 때 300명이라면 너무 적다고 판단되지 않을까 걱정되어서 어느 정도의 대략적으로 vus가 적정 인원인지가 궁금합니다, 3. 시도해보신 내용시도하진 않았지만 개선할 방법으로는 강의에서 제공해주신 mysql의 실행계획을 통해 index 추가와 커넥션풀 사이즈 늘리는 것 그리고 캐싱 도입을 생각하고 있긴합니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
NonNullApi를 NullMarked로 대체하라고 합니다.
spring 7 버전에서 부터는 NonNullAPI이 deprecated 되는 것 같습니다.대신 NullMarked로 대체하면 된다고 합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
Spring batch를 실행해줄 스케줄러와 batch 실행 환경
킬9형 안녕실무에서 Spring batch를 실행해줄 스케줄러와 batch 실행 환경은 어떤게 있는지 궁금해.현재 인프라는 AWS에서 EKS, ElastiCache(Redis), Aurora MySQL을 사용하고 있어.