묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결대규모 시스템 설계 Part 1
레디스(중앙 상태 관리 서버)에서 동시성 처리 하는 방식
동시성 제어는 분산락원자적 연산방식으로 해결한다고 설명해주셨는데,레디스 분산락의 경우, 락을 획득하려는 클라이언트가 Redis의 Set 명령어를 사용하게 되는데, 이때 NX(Not eXists) 옵션을 통해 키가 존재하지 않을 때만 값을 설정하도록 하기 때문에, 이 연산은 원자적으로 수행된다고 합니다.결론적으로 1, 2안 모두 원자적 연산을 의미하는것이라고 생각이 들어 헷갈리는데요..!혹시 어떤 의도로 말씀해주신건지 설명해주실 수 있나요?그리고 Redis를 예시로 들었을때, 레디스는 싱글 스레드 동작 방식이라서, 동시성 문제가 제어 된다고 하는데, 이 동시성 문제가 실제로 발생하는 경우는 어떻게 되는건지, redis 서버가 다중 노드일 때 발생하는건지 궁금합니다.
-
해결됨오브젝트 - 설계 원칙편
9-1 사소한 강의자료 오류
9-1. 더 많은 요구사항 추가하기강의자료 p.45, 강의영상 9:05 ~WorldMap은 target 으로 사용될 경우에만 Carrier를 치환할 수 있는데, 해당 슬라이드에서만 강의자료의 설명과 X 표시가 잘못된 것 같습니다. 영상에서의 설명은 올바른데 자료 표기만 문제가 있는 것 같아 남깁니다!
-
해결됨오브젝트 - 설계 원칙편
7-3 상속을 이용한 중복 제거 질문 있습니다!
7-3. 의존성 역전 원칙 - 추상화와 세부사항 13:43~수업을 듣던 도중 추상 클래스를 인터페이스와 함께 사용한 이유가 궁금해 질문드립니다.상속이 코드 재사용을 위해 그다지 좋은 방법이 아니라는(+ 자세한 내용은 뒤에서 더 자세히 살펴봄) 언급을 해주셨지만, 우선 여기서는 왜 이렇게 코드를 짰는지 궁금해 고민한 부분을 여쭤보고자 합니다. 인터페이스와 추상 클래스를 함께 사용하는 이유 1. 협력을 위해 제공하는 메시지를 확인하기 용이하기 때문인가요?해당 강의를 듣고나서 맨 처음 들었던 생각은, "추상 클래스로만 추상화를 한 뒤, 상위 수준 객체가 인터페이스 대신 추상 클래스를 의존하면 안될까?" 였습니다. 추상클래스를 사용하더라도 read()만 public이고 readLines()나 parse() 는 각각 private, protected 이므로 외부에 노출되지 않아서 괜찮지 않을까 생각했습니다.더 고민해 보았는데, 인터페이스를 사용한다면 코드를 유지보수하는 과정에서 다음과 같은 이점을 얻을 수 있어서 그런가? 라는 생각이 들어 질문드립니다. 상위 수준의 객체가 인터페이스에 의존하면 역할을 한 눈에 파악하기 쉽다.Reader 는 read()라는 메서드 시그니처로 "특정 데이터소스로부터 읽어오는 작업"을 수행한다. 라는 것을 인터페이스를 통해 명시한다. 즉, "명세" 역할을 한다.이는 유지보수 과정에서 해당 인터페이스만 읽고 구현체가 제공하는(또는 해야하는) 기능(public 메서드)들을 확인하기 용이하다. 즉, 역할을 한 눈에 파악하기 쉽다. 추상 클래스에 의존하면 역할을 한 눈에 파악하기 어렵다.AbstractReader는 메서드 시그니처 뿐만 아니라 중복 로직의 경우 구현 내용까지 포함하고 있고, 여러 메서드들 중 외부에서 협력하기 위해 pubilc으로 노출시켜 제공하는 기능을 한 눈에 파악하기 어렵다.위 두 가지 내용이 인터페이스를 추상클래스와 함께 사용하는 이유가 될 수 있을까요? 2. 두 public 메서드 중 하나는 중복 로직, 하나는 각 구현체마다 다르게 구현하는 경우에도 인터페이스와 추상클래스를 함께 사용하는 것이 좋을까요?1번에서 인터페이스와 추상클래스를 함께 사용한 이유로 언급했던 "역할을 한 눈에 파악하기 쉽다"는 장점이 있다면, 두 메서드 모두 public일 때에도 추상클래스로만 구현하기 보다는 인터페이스와 추상클래스를 함께 사용하는 것이 좋을까요? 2번 질문은 예시 코드를 드리자면 Spring Boot 개발환경에서 작업한 코드로 CaptchaHashProcessor 인터페이스에는 public 메서드인 hash() , verify() 두 메서드가 있습니다. 해당 인터페이스를 구현한 두 구현체에서 verify() 메서드가 중복되는 상황입니다. 기존 코드두 public 메서드를 제공하는 인터페이스public interface CaptchaHashProcessor { HashResult hash(Long captchaId); Long verify(String hashedCode, Long userId); }구현체 1 - hash는 다르게 구현하나 verify는 구현체 2와 내용 동일public class RandomCaptchaHashProcessor implements CaptchaHashProcessor { private static final SecureRandom RANDOM = new SecureRandom(); private final Encryption encryption; private final CaptchaLogPort captchaLogPort; private final EncryptionProperties properties; @Override public HashResult hash(Long captchaId) { // 구현체마다 다름... } @Override public Long verify(String encryptedCode, Long userId) { // 중복 로직 ... } }구현체 2- hash는 다르게 구현하나 verify는 구현체 1과 내용 동일public class FixedCaptchaHashProcessor implements CaptchaHashProcessor { private static final String FIXED_IV = Base64.getEncoder().encodeToString(new byte[16]); private final Encryption encryption; private final CaptchaLogPort captchaLogPort; @Override public HashResult hash(Long captchaId) { // 구현체마다 다름... } @Override public Long verify(String hashedCode, Long userId) { // 중복 로직 ... } } 추상클래스 사용여기서 추상클래스로 verify 중복 로직을 이동시키면서 인터페이스를 사용한다면인터페이스를 구현한 추상클래스 public abstract class AbstractCaptchaHashProcessor implements CaptchaHashProcessor { protected final Encryption encryption; private final CaptchaLogPort captchaLogPort; @Override public Long verify(String hashedCode, Long userId) { // 추상 클래스로 이동한 중복 로직 ... } }구현체 1public class RandomCaptchaHashProcessor extends AbstractCaptchaHashProcessor { private static final SecureRandom RANDOM = new SecureRandom(); private final EncryptionProperties properties; public RandomCaptchaHashProcessor(Encryption encryption, CaptchaLogPort captchaLogPort, EncryptionProperties properties) { super(encryption, captchaLogPort); this.properties = properties; } @Override public HashResult hash(Long captchaId) { // 구현체마다 다름 ... } }구현체 2public class FixedCaptchaHashProcessor extends AbstractCaptchaHashProcessor { private static final String FIXED_IV = Base64.getEncoder().encodeToString(new byte[16]); public FixedCaptchaHashProcessor(Encryption encryption, CaptchaLogPort captchaLogPort) { super(encryption, captchaLogPort); } @Override public HashResult hash(Long captchaId) { // 구현체마다 다름 ... } }이렇게 구현할 수 있을텐데, 인터페이스를 사용하지 않는다면 hash 메서드까지 추상 클래스의 추상 메서드로 명시해서 상위 수준 클래스가 추상 클래스에 의존해도 될 것 같아서 고민이 됩니다! 이 질문을 작성하면서 다른 생각도 떠올랐는데요, CaptchaHashProcessor는 캡챠 코드를 암호화(hash)하고 캡챠 코드를 검증(verify)한다는 두 가지 책임을 가진 것 같아서 어쩌면 암호화 책임은 인터페이스와 그 구현체들로 제공하고, 검증 책임은 또다른 클래스에서 구현하는 것이 적절한가? 하는 생각도 듭니다... 좋은 강의를 제공해주시고 긴 질문 읽어주셔서 감사합니다.질문은 타인이 저에게 소중한 시간을 소비하는 것이라 생각해 강사님의 시간 낭비가 되지 않도록 영양가 있는 질문을 잘 하고싶습니다. 혹시나 질문의 내용 구성이나 태도, 질문을 이끌어낸 사고과정 등에서 부족한 부분이 보였다면 어떻게 개선하면 좋을지 말씀해주시면 감사하겠습니다!
-
해결됨모르면 승진 안되는 시스템 디자인
시니어엔지니어 지원
이정도 스콥만 어느정도 완전히 인지하면 시니어 레벨 엔지니어 시스템 디자인 인터뷰는 어느정도 커버 될까요?
-
해결됨AI 시대 대체되지 않는 미국 빅테크 시스템 디자인 & 오픈소스 실무 기여 완성 코스
Blob Storage에서 파일 업로드에 대한 동시성을 어떻게 제어할 수 있을까요?
용량이 큰 파일의 binary를 기반으로 해시화해서 동시 업로드 할 경우 동일한 파일이 업로드 될 수 있을 것 같습니다. 이럴 경우 해결책이 있을까요?
-
해결됨오브젝트 - 설계 원칙편
함수형 스타일에 대해선 어떻게 생각하시나요?
이제 꼭 함수형 언어를 사용하지 않더라도 요즘 언어들 대부분 함수형 언어의 아이디어나 장점들을 반영하는 트렌드인데, 회사에서도 코틀린을 사용 중이라 질문 드려봅니다.코틀린 라이브러리들을 사용하다 보면 함수형 스타일의 설계와 API들을 꽤 많이 보고 있기도 하고 특히 람다를 굉장히 많이 사용하는데 적절하게 람다나 함수형 스타일의 코드를 사용하는 기준이나 원칙들도 있으신지 궁금하네요.
-
해결됨오브젝트 - 설계 원칙편
값 객체 활용에 대해
안녕하세요. 항상 객체 지향의 본질을 가르쳐주시는 강의 정말 잘 듣고 있습니다. 실무에서 JPA를 사용할 때 값 객체 활용에 대해서도 궁금합니다. RDB 기준 하나의 테이블에 매핑되는 경우말고, 값 객체를 별도의 테이블로 매핑해야될 경우에도 많이 사용하시는지 궁금합니다.
-
해결됨Python을 위한 디자인 패턴
노션링크
conceptual_singleton.py강사님 싱글톤패턴 드롭다운 코드예시 9:25 이부분 코드 예시가 펼쳐져 있지않아서 볼수가없네요.팩토리패턴 예시도 강의영상에서는 펼쳐져있지않네요.노션링크를 보면서 학습해야할 것같은데 어디있는지 모르겠습니다 ㅠ
-
해결됨카카오 코테 6주 합격! 실전 파이썬 코딩테스트
스스로 고민하고 답을 보지 않고 구현을 해보았는데요
# 1012 T = int(input()) dx = [0, 0, 1, -1] dy = [-1, 1, 0, 0] for _ in range(T): M, N, K = map(int, input().split()) graph = [[0] * M for i in range(N)] st = [] seen = set() # seen.add((0, 0)) for i in range(K): x, y = map(int, input().split()) graph[y][x] = 1 st.append([y, x]) cnt = 0 while st: cur = st.pop() for i in range(4): x = dx[i] + cur[0] y = dy[i] + cur[1] if not (0 <= x < N and 0 <= y < M): continue if (x, y) in seen: continue if graph[x][y] == 0: continue st.append([x, y]) seen.add((x, y)) if (cur[0], cur[1]) in seen: continue else: seen.add((cur[0], cur[1])) cnt +=1 print(cnt)값이 처음 구현 햇을때 제대로 안나오길래원래는 cur를 for i in range(4) 위에서 seen에 찍어줬었는데 -> 실패그래서 cur를 방점을 찍어주듯이 주변을 다 돌고 자신을 seen에 찍게 했더니 통과가 되서혹시 코드에 조언해주실 수 있는지 질문드립니다!
-
해결됨오브젝트 - 설계 원칙편
실례지만 여기에 후기 올립니다.
영호님 강의 잘 들었습니다.객체지향적인 설계에 대한 근원이되는 내용에 관심이 많아영호님의 서적과 강좌를 자주 보게 되네요 본론시중에 나와 있는 서적과 강좌가 정말 잘 되어 있는 만큼사람들이 많이 사용하는 스프링 프레임워크에 적용한 예제도 가끔 있으면 어떨까 합니다.생각보다 이 부분이 제 주변인들의 가려운 부분이었어요예를 들면스프링을 사용하는 가정하에 비즈니스 계층에 적용해야하는데,다형성이 필요한 서비스의 경우 "인터페이스 - 구현체" 로 구축시구현체들을 Spring Bean으로 사용할 경우, 컴파일 시 구체적인 구현체가 아니라 에러가 나는데이럴때는 구현체를 매핑해주는 팩토리를 생성해서 사용해야된다와 같은 다소 객체지향과는 동떨어지지만 소소한 설명이 언급되어도 좋을 것 같습니다.아마 강좌나 서적을 보는 많은 사람들이 비슷한 생각일 것 같습니다."이 부분을 만약에 업무에 적용시킨다면 어떻게 해야 할까나?" 대부분 이런 생각이지 않을까 해서 드린 말씀입니다.항상 고품질의 강좌와 서적을 위해 애써주시는 영호님께 다시 한 번 감사드립니다.
-
해결됨오브젝트 - 설계 원칙편
동일성과 동등성 설명이 바뀐 것 같습니다.
안녕하세요, 강의 잘 듣고 있습니다.객체 비교에 대한 설명 중, ‘동일성(identity)’과 ‘동등성(equality)’의 개념이 일반적인 프로그래밍 용어와 다르게 설명된 부분이 있는 것 같아 확인 요청드립니다. 강의에서 설명된 내용은 다음과 같습니다: (4-1, 4-2에서)속성 기반 ‘동일성(equality)’모든 변수가 동일한 객체 참조 -> ‘동등성(identical)’ 하지만 일반적으로 다음과 같이 구분됩니다:동일성: 참조가 같다, identical, 메모리 상에서 같은 객체를 가리킴동등성: 값이 같다, equality, 서로 다른 객체여도 내용이 같다. 한 번 확인해주시면 감사드리겠습니다.감사합니다!
-
해결됨오브젝트 - 설계 원칙편
인터페이스명이 변경된 걸까요??
Schedule 클래스는 RecurringPlan을 반환하는데, 갑자기 인터페이스명이 TemporalExpression으로 되어서 헷갈립니다!
-
해결됨오브젝트 - 기초편
3-1 강의 질문입니다.
안녕하세요. 강의 너무 잘 듣고 있습니다.궁금한 점이 생겨 질문을 드리게 되었는데요.3-1강의 1:00에서 데이터가 하나의 모듈 안에 모여있으면 코드를 수정하기가 어렵다고 하셨는데, 이 부분이 잘 이해가 되지 않습니다.지금까지 데이터와 프로세스를 서로 다른 모듈로 분리시킨 절차적인 방식에서 프로세스 로직을 데이터를 구현한 모듈로 이동시켜 하나의 모듈 안에 넣는 작업을 했는데, 이와 모순되는 것 같아서 혼동이 왔습니다.말씀하신 내용이 모든 로직과 데이터를 설계없이 하나의 모듈에 모두 넣은 경우를 말씀하시는 걸까요?감사합니다 :)
-
해결됨카카오 코테 6주 합격! 실전 파이썬 코딩테스트
섹션 6 사전문제 3번문제 답안이 틀린것 같아요
1번문제 예시 답안에 답안 코드가 없구요3번문제 답안도 문제 수열 (3, 6, 13, 28, 59, ...)과 안맞는데점화식이 a(n) = a(n-1)*2 + (n-2)가 되야 수열과 맞는데 확인 부탁드려요
-
해결됨오브젝트 - 설계 원칙편
player 내부에 worldmap
player 내부에 worldmap이 있는 것은 좀 어색하다고 느껴지는데 game에 있어야 하지 않을까요??
-
해결됨오브젝트 - 기초편
책 두권 다 읽어봐야 할까요?
강의를 이해하기 위하여 책 두권 다 읽어봐야 할까요?
-
해결됨시스템 디자인 첫걸음: 면접에서 돋보이는 백엔드 아키텍처 설계하기
멱등성. '같은 요청'의 기준?
같은 요청이 여러 번 들어와도 한 번만 처리하는 것. 여러 번의 요청이 들어왔을 때 이 요청이 '같은 요청' 이라는 것을 정확하게 판단할 수가 있을까요?예를 들어 똑같은 점포의 똑같은 POS에서 똑같은 액수의 포인트 적립/사용이 두 번 들어왔을 때,이 두 요청이 각자 다른 요청인지? 클라이언트 단의 문제로 인해 같은 요청을 두 번 보낸 것인지? 정확하게 판단할 수 있는 걸까요?두 요청의 도착 시간 간격이 매우 짧을 때-> 일반적인 상황에서 같은 동작이라고 판단할 수야 있겠지만.. 매우 빠르게 요청을 계속해서 받아야 하는 상황이라면?도메인 특성에 따라 같은 요청임을 판단할 수 있는 기준이나 상황이 달라지기야 하겠지만 정확하게 보장 받을 수 있는 기준은 존재하기 어렵지 않나 하는 생각이 듭니다.실제 사례를 통해 예시를 들어주실 수 있는 게 있을까요?
-
해결됨오브젝트 - 설계 원칙편
9-6 순환참조인거 같은데..
이 코드에서 Game은 GameLoop만 알지만Cui, Gui는 GampLoop와 Game을 동시에 알죠.즉 Gamp과 Cui, Gui은 쌍방향 참조로 봐야하지 않을까요. 실제 Game을 수정하면(exe로 메소드명을 바꾼다던가) Gui, Cui도 수정해야하니까요.
-
해결됨오브젝트 - 설계 원칙편
8-5 오타
astractreader인데...
-
해결됨오브젝트 - 설계 원칙편
7-5 자막오타
parser..