자기 소개
집에서 빈둥대다 개발에 흥미를 느껴 개발 공부를 시작하였고 현재는 판교에서 플랫폼 서버 개발을 담당하여 진행하고 있습니다.
제가 공부를 했던 방법과 실무에서 접하실 수 있는 여러가지 문제점들과 해결책을 여러분들에게 제공하고 싶어 지식공유자 활동을 이어나가고 있습니다.
강의는 오로지 저만의 지식을 통해 만들어지지 않습니다. 모든 강의는 함께하시는 분들이 계십니다.
유니콘 스타트업에서 개발도 하고, DB도 관리하시는 능력자
지식공유자 경력
[前] 샌드박스 블록체인 개발자
[前] 넥슨 자회사 백엔드 개발자
[現] 판교에서 고여가는 서버 개발자
인터뷰 이력
강의
로드맵
전체 1수강평
- 가장 쉽고 깊게 알려주는 MongoDB 완벽 가이드 [ By. 비전공자 & Kakao 개발자 ]
- 카카오 개발자와 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법 [ By. 비전공자 & Kakao 개발자 ]
- 카카오 개발자와 함께하는 워크플로우 기반의 대용량 트래픽 처리 기법 [ By. 비전공자 & Kakao 개발자 ]
- 5천억건이 넘는 금융 데이터를 처리하는 토스 개발자에게 배우는 MySQL [ By. 비전공자 & Toss 개발자 ]
- 5천억건이 넘는 금융 데이터를 처리하는 토스 개발자에게 배우는 MySQL [ By. 비전공자 & Toss 개발자 ]
게시글
질문&답변
섹션8. CAP 퀴즈 질문
안녕하세요 메웅교농베님 질문 주셔서 감사합니다.먼저 질문에 대한 답의 기준은 CAP 이론이 무엇인지 알고 있다는 것을 가정해보도록 할게요. 질문에 대한 어떤 답을 하셨는지도 궁금하네요 ㅎㅎ 우선 MOngoDB는 레플리카를 기본적으로 구성합니다. 즉 네트워크 분할이 발생한다면 과반수 정책을 통해서 주요 노드 즉 Primary Node를 정하게 되는 것이죠. 그리고 선정되지 못한 노드들은 Write에 사용이되지 않고 트래픽을 분산하고자 하는 READ용 데이터 베이스로 구성이 될 겁니다. 아니면 복제와 고가용성을 위한 노드로써 유지가 되겠죠그리고 이떄 읽기 요청은 설정에 따라서 세컨더리를 통해서 읽을 수도 있을겁니다. 그래서 이러한 관점에서 보았을 떄, 저는 일관성 보장을 위해서 일부 가용성을 희생하는 구조라는 생각이 드네요. 왜냐하면 우선적으로 일관성을 유지하기 떄문입니다. 과반수의 합의가 없다면 쓰기 작업을 진행하지 않기 떄문이고네트워크 분할상황에서도 시스템이 동작한다는 내성을 가지고 있따고 생각해요.또한 소수 그룹에 속한 노드 즉 Primary Node가 아닌 노드들은 쓰기가 불가능하기 떄문에 가용성을 일부 희생하지 않나라는 생각이 듭니다.그래서 최종적으로 CP 성향을 가진 DB라고 생각합니다.
- 0
- 1
- 24
질문&답변
레디스 활용에 대해서 질문드립니다!
안녕하세요 dt10002님 질문 주셔서 감사합니다.결론적으로 말씀드리자면 거의 없습니다. 아마 한번도 안치실 수도 있어요. 왜냐하면 redis-cli를 굳이 사용하지 않아도 정보를 볼 수 있는 GUI툴들이 있기 떄문입니다.redisInsight 물론 redis-cli를 통해서 데이터를 추가해야한다면, 사용하시기도 하겠지만, 거의 다 데이터를 확인하거나 삭제하는 부분이 많기 떄문에 redis-cli를 직접적으로 활용하시는 케이스는 거의 없다고 봐주시면 됩니다. 감사합니다 :)
- 0
- 2
- 12
질문&답변
자바 17로 하셨던데 21로 해도 되나요?
듣는데에는 큰 무리가 없고 사용하시는데에 있어서는 큰 차이가 없을꺼 같기는 합니다만. 버전에 따른 만약 차이가 일부 발생할수는 있을꺼 같습니다. 17버전과 21버전 사이의 차이를 이 과정에서 모두 핸들링하고 고려하며 추적하기에는 무리가 있을꺼 같아서요.
- 0
- 1
- 22
질문&답변
stomp websocket
https://inf.run/wGCRE해당 질문과 동일하기 떄문에 해당 질문을 참고 부탁드릴게요!!
- 0
- 1
- 22
질문&답변
웹소캣 stomp
안녕하세요 김옥윤님 질문 주셔서 감사합니다!!비슷한 질문을 두개해주신거 같아서 그냥 이 글에 한번에 설명드리도록 할게요.https://inf.run/wHVus 자 일단 둘다 질문주신 부분에 대해서 정답을 내리기는 너무 추상적인 질문이라고 생각이 듭니다. 특정 다르게 코딩만 한다는것이 기준이 어디까지인지, ChatWebSocketHandler만 수정하신다는게 뭔지 이거는 사실 너무 제가 어떤 기준으로 판단하고 설명을 드려야 하는지 판단하기에는 애매한거 같아요. 그래서 그냥 범용적으로 STOMP를 사용 했을 떄의 코드를 일부 보여드리면 좋지 않을까라는 생각을 하였습니다. 일반적으로 우리가 STOMP를 사용한다면, 이런 코드를 구현하시면 됩니다.import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WssConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry ){ registry.enableSimpleBroker("/sub"); registry.setApplicationDestinationPrefixes("/pub"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws-stomp").setAllowedOrigins("*"); } }엔트포인트와 prefix를 저장해줌으로써 Client와 연결 할 수 있는 통로를 지정해 줍니다. import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; import com.example.demo.domain.chat.model.Message; import com.example.demo.domain.chat.service.ChatService; import com.example.demo.domain.repository.ChatRepository; import com.example.demo.domain.repository.types.Chat; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.sql.Timestamp; @RequiredArgsConstructor @Controller @Slf4j public class WssControllerV1 { private final ChatService chatService; @MessageMapping("/chat/message/{from}") @SendTo("/sub/chat") public Message sendMessage( @DestinationVariable String from, Message msg ) { return msg; } }그후 그냥 웹소켓 통신해주시면 됩니다. 들어오는 요청에 대해서 이제 어떤 경로로 또 전송을 해줄지에 대해서도 추가로 맵핑해주면 된다고 보시면 됩니다. 이 코드는 어디까지나 예시라고 봐주시면 될 꺼 같아요. 그래서 추가적인 미들웨어나 부수적으로 구현하고자 하는 기능은 여기에서 살을 붙이는 형태라고 봐주시면 될 꺼같습니다. 질문주신것처럼 당연히 다르게 작성을 해주셔야하고, 기본적으로 형태가 일부 다릅니다. 개념도 좀 다른 부분이 있어서 그 부분을 참고해주시면 좋을꺼 같아요. 감사합니다 :)
- 0
- 2
- 26
질문&답변
이벤트 기반 주문 질문 있습니다.
안녕하세요 qheogus55님 질문 남겨주셔서 감사합니다.이 부분은 어떤 기능을 EDA 아키텍처를 도입해서 사용할지를 정해야 하는거 같아요. 말씀해주신 부분처럼 사용자 경험 관점에서는 당연히 동기식이 더 직관적입니다. 실패인지 성공인지 알 수 있기 때문이에요. 하지만 상황에 따라서 일부 처리를 EDA 기반의 아키텍처로 뺼수도 있겠죠 예를들어서 사용자가 성공했다는 행위를 쿠폰 발급까지만 진행하고, 쿠폰 발급에 대힌 메일 전송과 같은 기능은 이벤트화해서 처리하거나 이런식으로 시간이 오래 소요 될 수 있는 행위에 대해서는 이벤트화 하는것이 좋습니다. EDA 기반의 아키텍처에서 가장 큰 문제가 될 수 있는 부분이 말씀해주신 재고와 관련된 서비스 입니다.그래서 간단하게 해결을 하자면1. 재고 확인 2. 확인 후 문제가 없다면, 이벤트를 전송 (이떄 해야하는 작업이 많겠죠) 3. 특정 이벤트 작업 후 재고 처리 3.1 에러가 발생하면 복구 트랜잭션 발행 3.2 아니면 성공하는 이벤트들에 대해서 추가적으로 수집하여 전체적인 총괄 처리이런식으로 해결하는것이 일반적인 패턴입니다.그래서 이런 구현에 대해서 Saga 패턴도 고민해 보시면 좋을꺼같아요. 질문에 대한 답변이 되었으면 좋겠네요. 혹시 추가적인 질문 있다면 남겨주세요!! 감사합니다 :)
- 0
- 2
- 33
질문&답변
9강 인덱스 설계 관련 문의
안녕하세요 민섭님 질문 주셔서 감사합니다. 말씀해 주신 부분처럼, 옵티마이저가 쿼리 컬럼의 순서를 자체적으로 재졍렬 할 수 있습니다. 하지만 하지 않아도 되는 작업인데, 다시 재계획을 할 필요가 있는지 고민해 보시면 좋을꺼같아요. 예를들어서 그냥 "A"라는 길로 가면 되는데, 굳이 "B -> A" 이렇게 돌아서 갈 이유가 있을까요?? "B" 라는 길로 가다가 "어 길이 잘못되었네?? 수정해야지" 해서 "A"로 간다면, 그냥 "A"로 가는것보다 더 비효율적일겁니다. 똑같은 원리로 그냥 처음에 명확하게 길을 알려준다면, 옵티마이저는 추가적인 작업을 할 필요가 없을꺼에요. 그냥 옵티마이저도 인정하고 우리도 인정 할 수 있는 길이 될거니깐요. 이런 개념으로 이해하시면 됩니다. 무언가 자동으로 처리해주는 것은 그만큼 비효율을 낳을수가 있습니다. 이 부분을 이해하시면 프로그래밍을 하는데에 있어서 도움이 되실 꺼 같아요. 질문 주셔서 감사합니다 :)
- 1
- 2
- 35
질문&답변
access_token Db 저장건
안녕하세요 최영준님 질문 주셔서 감사합니다. 이 서비스는 어떤식으로 관리하냐에 따라서 달라지는 부분인거 같습니다. 말씀하신 내용처럼 Redis에 관리하셔도 무방합니다. 하지만 상황에 따라서 MySQL에 저장을 해야 할 수도 있어요. 예를들어서 브라우저 세션을 기준으로 token의 유효기간이 유지가 된다면 어떻게 할까요?? 그러면 재로그인 하였을 떄, 해당 token을 다시 핸들링 해야 하는 경우도 있을 수가 있습니다. 또한 이 access_token과 refresh_token을 혼용해서 사용 하는 경우 관리적인 부분도 존재 할 수도 있을것이고, 추가로 redis를 일종의 인메모리 DB로 활용하시거나 refresh_token까지 같이 활용을 하신다면, 유저당 1:1로 데이터가 생성이 될것이고 이로인해 Redis에 대한 과부하가 발생가능하지 않을까라는 생각도 드네요. 하지만 말씀하신 부분처럼 단순 휘발성 데이터의 성질도 가지고는 있기 떄문에 최영준님이 생각하시는 방향으로 구현하셔도 큰 문제는 없다고 생각합니다. 개발에 정답은 없다고 생각하는 주의라서요. 질문 주셔서 감사합니다 :)
- 0
- 2
- 33
질문&답변
인덱스 및 DB 질문
제가 주말에 야외 일정이 있어서 내일 저녁쯤에 확인 후 답변 추가해두겠습니다. 죄송합니다 ㅠ
- 0
- 2
- 30
질문&답변
첫번째 프로시저 명령에서 Account가 생성되지 않습니다
안녕하세요 질문 주셔서 감사합니다. 프로시저를 통한 목 데이터 생성은 제가 알려드리는 주제에 대해서 여러분들이 원하시는 방향으로 쿼리도 작성해보라는 의미 입니다. 실제 강의가 진행되면서 해당 ddl을 기반으로 쿼리를 작성하는 경우도 있고 따로 참조하지 않는 경우도 존재합니다. 어디까지나 여러분들을 위한 테스트 데이터이기 때문에 제가 따로 의도한바는 없으니 편하신대로 필요하시다면 추가해서 사용해보셔도 됩니다.기본 포멧을 프로시저 사용하는 쿼리 구문보시면 쉽게 이해가 되실꺼라 추가적인 ddl에 있어서도 스스로 만들어보고 활용가능하실거 같네요. 이 과정에서 혹시나 질문 있으셔도 편하게 주셔도 됩니다!! 날이 많이 덥고 비가오는데 건강 조심하세요 :)
- 0
- 1
- 47