inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

코틀린에서 value class 적용 시 문제

미해결

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

안녕하세요 코틀린으로 현재 강의를 수강하고 있는 수강생입니다. 현재 자바로 작성된 코드를 보고 설명과 함께 어떤 이유로 이런 코드를 작성한 것인지 생각하며, 코틀린으로 이 개념을 적용하면 어떻게 작성할 수 있을지 DDD와 클린 아키텍처를 코틀린 문법 활용하여 구상하는 연습 중입니다. 현재 Member 도메인 코드 개선 강의에서 value class 적용하여 필드의 값이 바뀌는 문제(email자리에 nickname이 오더라도 같은 String이라 컴파일 에러가 안 남)를 해결하려 시도했습니다 package org.example.splearn.domain @JvmInline value class Email( val value: String, ) @JvmInline value class Nickname( val value: String, ) @JvmInline value class PasswordHash( val value: String, ) class Member private constructor( val email: Email, var nickname: Nickname, var passwordHash: PasswordHash, 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.value) fun changeNickname(nickname: String) { this.nickname = Nickname(nickname) } fun changePassword( password: String, passwordEncoder: PasswordEncoder, ) { this.passwordHash = PasswordHash(passwordEncoder.encode(password)) } fun isActive(): Boolean = this.status == MemberStatus.ACTIVATE companion object { fun create( memberCreateRequest: MemberCreateRequest, passwordEncoder: PasswordEncoder, ): Member = Member( email = memberCreateRequest.email, nickname = memberCreateRequest.nickname, passwordHash = PasswordHash( passwordEncoder.encode(memberCreateRequest.password.value), ), status = MemberStatus.PENDING, ) } } 강의대에서는 static 메소드인 of에서 MemberCreateRequest를 파라미터로 사옹하고 있습니다. 코틀린이라 companion object를 사용했구요 그러던 중 "헥사고날 아키텍처의 특성을 고려하면 의존성 외부 로직인 dto가 내부로 향해야 하고 따라서 도메인이 dto에 의존하는 것이 괜찮을까" 하는 의문이 들었습니다. companion object { fun create( email: Email, nickname: Nickname, password: String, passwordEncoder: PasswordEncoder, ): Member = Member( email = email, nickname = nickname, passwordHash = PasswordHash( passwordEncoder.encode(password), ), status = MemberStatus.PENDING, ) } 그래서 코드를 수정해 보면 이런 식으로 수정해 볼 수 있을 것 같습니다. 이에 대해서 토비님 의견이 어떠신지 여쭙고 싶습니다

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

thread pool

해결됨

백엔드 개발자 성능 개선 초석 다지기

common pool을 사용하지 않도록 thread pool을 설정 해야 된다고 주의사항을 적어주셨는데 그 이유는 무엇인가요? 그리고 둘의 차이는 onPool-worker-3, pool-1-thread-8 이라고 알려주셨는데 차이가 이거밖에 없는건가요?

  • java
  • mysql
  • spring-boot
  • cache
  • index
Cola 댓글 1 좋아요 0 조회수 83

다음 강의 언제 나올까요?

미해결

타입스크립트로 배우는 리액트(React.js) : 기초부터 최신 기술까지 완벽하게

안녕하세요 쌤 짧고 실무에 바로 써먹을 수 있는 좋은 강의 만들어주셔서 감사해요. 지금까지 코딩이 제 뇌와 맞지않는다고 느꼈는데 쌤의 짧고 핵심 위주 실습이 반영된 강의 덕분에 많은 도움을 받고있습니다. 다름이 아니라 Next 강의도 예정중이시라는 글을 봤는데 혹시 언제쯤 나오는지 대략적으로라도 알 수 있을까요? 다른 강사님의 강의는 안맞고 수코딩님 강의만 맞아서 next 도 수코딩님 강의로 시작하고싶어서요 React query 관련된 강의나 tanstack query, tanstack router 부분은 없는데 이유가 있을까요? 쿼리 부분은 혼자 공부해야하는 파트일까요? 종종 단톡방을 운영하시는 강사님을 보았는데 수코딩님 단톡방도 있는지 궁금합니다! 좋은 강의 만들어주셔서 정말 감사해요!

  • react
  • next
  • reactquery
joo0 댓글 1 좋아요 0 조회수 91

아키텍처와 TDD의 오해에 대해 질문드립니다.

미해결

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

안녕하세요, 강사님! Spring Boot TDD 강의 정말 잘 듣고 있습니다. 강의 내용 중 궁금한 점이 생겨 질문드립니다. 보통 Spring에서 개발할 때 Controller-Service-Repository 구조의 레이어드 아키텍처를 많이 사용하는데요, 강의에서는 컨트롤러가 직접 리포지토리의 save 같은 메서드를 호출하면서 비즈니스 로직을 처리하는 경우가 있는 것 같습니다. 혹시 이것이 강의의 핵심 내용에 집중하기 위해 코드를 단순화 하신 것인지, 아니면 강사님께서 실제로 선호하시는 개발 스타일 이신지 궁금합니다. 만약 후자라면 어떤 장점이 있는지 그 이유에 대한 의견을 여쭙고 싶습니다. 더불어, "TDD를 잘하려면 인터페이스를 많이 사용해야 한다"는 것이 일종의 오해라는 말씀에 크게 공감했습니다. 그런데 왜 개발자들 사이에서 이런 오해가 생겨나게 된 것인지 그 배경이 궁금합니다. 마지막으로 추후에 비즈니스가 복잡해지면 테스트가 깨졌을 때 어디가 문제인지 파악이 어려울 것 같은데요 이에 따른 문제를 어떻게 해결하시나요? 단위테스트를 추가로 작성하시는지도 궁금합니다.

  • tdd
  • spring-boot
  • 아키텍처
  • junit
광주_5반_김민우 댓글 2 좋아요 1 조회수 160

피그마 한글 버전

해결됨

[VOD] 6주 완성! 개발 실무를 위한 고농축 바이브코딩 (Cursor AI, Figma)

피그마 한국 버전으로 가입 해야 되나요 학습 피그마가 영문이라도 한글 버전으로도 호환 되나요? https://www.figma.com/ko-kr/

  • react
  • next.js
  • cursor
  • 프롬프트엔지니어링
  • 바이브코딩
ecj 댓글 2 좋아요 0 조회수 567

10.3강 React.memo와 컴포넌트 렌더링 최적화 질문

미해결

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

export default memo(TodoItem, (preProps, nextProps) => { if (preProps.id !== nextProps.id) return false; if (preProps.isDone !== nextProps.isDone) return false; if (preProps.content !== nextProps.content) return false; if (preProps.date !== nextProps.date) return false; return true; } 사실상 isDone 빼고 바뀌는 게 없으니 if 부분 지울 수도 있나요? 아니면 위험한가요?

  • javascript
  • react
  • node.js
  • 카카오공채-개발
donghun Kang 댓글 2 좋아요 0 조회수 78

Arrays.sort

해결됨

김영한의 실전 자바 - 중급 2편

[질문 내용] MyUser에서 compareTo를 Override한 뒤 Arrays. sort ( array ); System . out . println(Arrays. toString ( array )); 을 했을때 나이 순으로 정렬이 되는데 이게 어떻게 이렇게 되는건지 잘 이해가 되질 않습니다. sort가 내부에서 compareTo를 호출하고 array가 MyUser타입이기 때문에 MyUser에서 Override한 compareTo를 호출하는건가요?

  • java
  • 객체지향
  • 코딩-테스트
  • 알고리즘
Cola 댓글 1 좋아요 0 조회수 85

원더랜드(프림)

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

제가 다익스트라 알고리즘이랑 헷갈려서 질문드립니다. 프림에서는 아무 정점(ex.1번노드)를 시작 정점으로 잡고 pQ.poll하면 선생님 로직은 poll된 노드는 무조건 최소값이다라고 확정짓고 ch배열에 1로 하시는 거에서 혼동이 옵니다. 아직 다른 정점들을 다 방문하지 않았는데 왜 최소값으로 단정짓는지 모르겠습니다. 만약 시작 정점을 1로 하고 1에 연결된 다음 노드들이 1이 아닌 다른 노드들에서 오는 값이 최소일 거라는 가능성은 왜 배제된거죠?

  • java
  • 코딩-테스트
rlgus4531 댓글 1 좋아요 0 조회수 68

임의데이터 generator방식과 @Transactional에 대한 고찰

미해결

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

안녕하세요, 강사님. TDD 관련 강의 항상 잘 듣고 있습니다. 강의 내용을 따라 실습을 진행하던 중, 테스트 격리 전략에 대해 궁금한 점이 생겨 질문 남깁니다. # 강의에서 다뤄주신 상황 강의에서처럼 여러 테스트 메서드에서 동일한 이메일 값을 사용하니, 테스트 클래스 전체를 실행했을 때 JPA의 유니크 제약 조건 위반 에러가 발생했습니다. 이로 인해 개별 테스트는 성공하지만 전체 테스트는 실패하는 상황에서 궁금증이 생겼습니다. # 제가 먼저 생각한 해결책: @Transactional 을 이용한 롤백 저는 강의를 들여면서 이 문제를 해결하기 위해, 각 테스트 메서드에 @Transactional 애너테이션을 붙여 테스트가 끝나면 자동으로 롤백시키는 방식을 먼저 떠올렸습니다. 이 방법으로 각 테스트가 독립적인 트랜잭션 내에서 실행되고, DB 상태를 다음 테스트에 영향을 주지 않는 상태로 유지할 수 있다고 생각했습니다. ##강사님의 방식(임의 데이터 generator)에 대한 질문## 그런데 강사님께서는 강의에서 롤백 방식을 사용하지 않으시고, UUID 등을 활용해 매번 고유한 이메일 주소를 생성해주는 데이터 제너레이터 방식을 사용하셨습니다. 강의에서도 @Transactional 을 성능 등 여러가지 이유로 인해 사용하지 않았다고 하셨는데요. @Transactional 을 이용한 롤백 방식도 충분히 좋은 해결책이라고 생각했는데, 강사님께서 UUID 생성 방식을 선택하신 특별한 이유나 설계 철학이 궁금합니다. 혹시 제가 생각한 롤백 방식에 비해 UUID 생성 방식이 갖는 실용적인 장점(ex. 롤백을 하지 않으니 디버깅의 용이성(?))이 있을까요? 두 방식의 장단점과 어떤 상황에서 어떤 전략을 선택하는 것이 실무에서 더 좋을지에 대한 강사님의 고견을 듣고 싶습니다. 감사합니다!

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

오타 발견

미해결

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

가령 다음과 같이 g etExecutionContextSerializer() 메서드를 오버라이드하면 g에 볼드처리안됨 -- 원시적 침투 예제의 BatchConfig에서 DefaultBatchConfiguration 상속을 제거하고@EnableBatchProcessing을 추가하자. 다음과 같이 말이다. 예제 밑의 예제가 그냥 기존 DefaultBatchConfiguration 방식만 나와있음 아마 기존과 수정을 두개 다 표시하는식으로 하고싶었을거같음 -- JobContext/StepContext: Late-Binding의 최종 무기고 키룩형 JobContext/StepContext가 존재하면 배치 스코프가 활성화된 상태라는 것은 알겠어. 근데 이 JobContext/StepSontext 대체 어디에 써먹는거지? 단순히 활성화를 의미하는게전부인가? 키룩형 -> 갈매기가 되고싶은 내면의 소리일수있음 괜찮음 주변에 돌멩이 지망생도 있고 독수리 지망생,딸기우유 지망생도 있어서 이해할수있음

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

(기출) 2025년 1회 (1/3) 9:55 for 문

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

보통 for 문작성할 때 아래 예시 처럼 작성하는데 for(;;++i) 인 경우에는 반복문 실행하기전에 i를 1 크게하고 반복문을 시작하나요? 예시 int 1; for(i=0;i<10;i++)

  • python
  • java
  • c
  • 정보처리기사
mark Kim 댓글 2 좋아요 0 조회수 59

[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 문제와 풀이 정답 코드에서 if (inventoryResult && shippingResult && accountingResult) { log("모든 주문 처리가 성공적으로 완료되었습니다."); } else { log("일부 작업이 실패했습니다."); } else 블록이 실행되는 케이스가 있을까요? future.get() 했을 때의 결과가 모두 true가 나오거나 예외가 터져서 else 블럭은 실행되지 못하는 것으로 이해했습니다. 이렇게 이해한 것이 맞을까요? 예제를 간결하게 하기 위해 예외 처리는 제외하셨다고 적어주셨는데 혹시 이와 관련된 부분일까요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
happyrichman 댓글 1 좋아요 0 조회수 83

혹시 필요한 라이브러리들을 미리 전부 설치해도 되나요?

미해결

React Native with Expo: 제로초에게 제대로 배우기

필요한 라이브러리를 미리 설치해둬도 되나요? expo에서 'eas build --platform android --profile development' 해당 명령어를 사용해서 빌드할 때마다 시간이 너무 오래걸려요ㅜㅜ 하나 설치하면 계속 그런 라이브러리 없다고 해서 계속 다시 빌드해야해서ㅜㅜ 혹시 강의에 사용한 라이브러리 리스트가 있다면 제공해주실 수 있나요?? 무료를 사용하면 1시간도 기다리라고 해서요...ㅜㅜ

  • react
  • react-native
  • 하이브리드-앱
  • typescript
  • expo
이수민 댓글 2 좋아요 1 조회수 85

이런 코드는 어떤가요?

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

import java.util.*; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); solution(in.nextInt(), 1, 1, 0); in.close(); } public static void solution(int target, int start, int value, int prevValue) { if (target >= start) { System.out.print(value + " "); solution(target, start + 1, value + prevValue, value); } } } 다음과 같이 풀어보았는데요, 재귀와 메모이제이션을 비슷하게 구현한것 같아서요. 이렇게 작성하면 어떨지 문의드려요!

  • java
  • 코딩-테스트
조영상 댓글 1 좋아요 0 조회수 78

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

미해결

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 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 조회수 106

코틀린에서 상속 시, 주의점에 대한 질문

미해결

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

태현님, 안녕하세요. 뭔가 하나 더 궁금해져서 질문을 드리게 되었습니다! 아래의 두 클래스가 있다고 가정해보겠습니다. package me.sungbin.lec10 open class Base( open number: String = "100", ) { init { println("Base Class") println(number) } } package me.sungbin.lec10 class Derived( override val number: String, ) : Base() { init { println("Derived Class") } } 그리고 실제로 아래와 같이 Derived 클래스의 생성자를 호출하면 number값으로는 null이 출력됩니다. 여기서 궁금한 것은 number는 non-nullable한 타입인데 null이 왜 출력이 될까? 라는 궁금증이 생겼는데요.. 그래서 GPT한테 물어보니 아래와 같은 답변을 얻을 수 있었습니다. 레퍼런스 타입(예: String ) → JVM 기본값 null 이 출력됩니다. (Kotlin의 Non-null 보장도 생성 중(super 생성자 실행 중) 에는 예외적으로 깨질 수 있습니다.) 이렇게 들으니 뭔가 이해가 된 듯 보이는데 이게 GPT 피셜이다보니 태현님의 의견이 듣고 싶어져서 질문을 남깁니다!

  • java
  • kotlin
  • 객체지향
양성빈(Robert) 댓글 3 좋아요 1 조회수 139

flex를 grid 처럼 만들기 질문드립니다.

해결됨

[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스

css 04-2-2 반응형과 grid 조합 - 플렉스박스와 그리드 비교 수업 12분 15초 내용을 감싸는 div를 만들어서 어떻게 해야 grid 와 같이 만들 수가 있는 건지 궁금합니다.

  • react
  • react-native
  • 하이브리드-앱
  • graphql
  • next.js
robotics 댓글 2 좋아요 0 조회수 132

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

미해결

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

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

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

6-2 강의 노션 코드 오타인거죠? 2

해결됨

React & FastAPI로 만드는 투표 커뮤니티 플랫폼: 결제 시스템으로 수익화까지!

위치: SingleTopic/Chart/ChartCanvas.jsx (39번 라인) 문제: stroke={colors[i].bg} // ❌ 현재 코드 원인: voteColors.js 의 실제 구조는 문자열 배열입니다 예: 2: ["#10B981", "#F43F5E"] .bg 프로퍼티가 존재하지 않아 undefined 반환 해결: stroke={colors[i]} // ✅ 수정 코드 결과: 수정 후 차트 선 색상이 정상적으로 표시됩니다. 제안: 후속 수강생들을 위해 강의 자료 업데이트 부탁드립니다. 강의 노션 코드에 오타가 너무 많아서 도움을 주는 자료인지 강의 진행을 방해하는 자료인지 모를 정도입니다. 솔직히 좀 심각합니다. 감사합니다.

  • react
  • mysql
  • docker
  • rest-api
  • FastAPI
고리오영감 댓글 3 좋아요 0 조회수 126

멀티모듈에서 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 조회수 98

인기 태그

인프런 TOP Writers

주간 인기글