게시글
질문&답변
2024.05.29
repository 트랜잭션 관련 질문
안녕하세요 😆 먼저 해당 강의 내용에서 더 나아가서 질문을 주셔서 너무 감사드립니다. 저는 이렇게 강의 내용을 넘어서는 질문이 들어오면 너무 흥미롭게 보고 있어서 기분이 좋네요. 일단 MySQL 을 기준으로 설명을 드릴게요. 현재 실무에서도 약 100억건의 데이터를 MySQL 로 이관하는 작업을 진행했어 가지고, 해당 DB가 좀 더 정확한 설명이 될 꺼 같습니다. 이와 관련해서도 강의를 준비중에 있으니 기회가 되신다면 찾아주세요!! 😆 먼저 저 같은 경우에는 MySQL 을 다루는 경우에 있어서 Session 이라는 형태를 사용하지 않습니다. 제가 Java 부분에 대해서는 잘 알지 못하지만 JPA 을 사용하시면 MongoDB든지 MySQL이든지 세션을 통해서 tx 를 전송하는 걸로 알고 있어요. 이 부분은 제가 틀릴 수도 있습니다. 또한 보통 이렇게 다수의 Tx 를 다루는 방법은 어떤 쿼리냐에 따라 다르겠지만, INSERT 의 경우에는 prepared 또는 Bulk 를 사용하게 됩니다. 질문자 분께서 질문을 해주신 내용중에 서비스에서 필드로 보관하면서 repository 를 호출하여 트랜잭션을 넘겨준다. 해당 내용은 일단 잘못되었습니다. 서비스는 반드시 repository 에서 데이터를 받아서 처리하는 주체가 되어야 합니다. 무언가 가공한 데이터를 넘기게 되면 기본 구조가 무너지게 됩니다. 일부 상황에 따라서는 가능하겠지만 지양해야 하는 방식이라고 생각을 합니다. 2 번 내용이 아마 세션에 관한 내용인거 같아요. 세션을 사용하게 되면, 세션간 Raw 에 대한 접근이 불가능 합니다. 이는 이제 Exclusive Lock, Search Lock 등등 다양한 이름으로 불리게 되는데, 이러한 경우에 있어서 병목 현상이 발생을 하거나 DeadLock 까지 발생을 하여 Tx 가 실패를 하는 경우가 많습니다. 그래서 어디까지나 저의 경우지만 저는 실무에서 왠만하면 세션을 사용하지 않습니다. 3번 같은 경우에는 제가 JAVA 에 대한 지식이 부족하여 내용을 이해하지 못하였네요 ㅠㅠ 어느정도 질문에 대한 답변을 해드린거 같고, 마지막 요약에 대한 답변을 해보자면 다음과 같습니다. INSERT 를 기준으로 설명 드리겠습니다. 일단 제가 실무에서 관리하는 서비스의 구성도는 다음과 같습니다. 일단 API 서버 (제가 관리합니다.) 데이터 집계 모듈 (거래량을 관리 합니다.) 데이터 수집 모듈 (제가 관리 합니다.) 이러한 구조에서 2 번 항목은 Update 가 많이 발생을 합니다. 심하면 100 QPS까지도 발생을 하기도 합니다. 매우 드물지만 3 번 항목은 INSERT, UPDATE 가 주로 발생을 합니다. 이러한 구성도에서 사실 1,2,3 번이 서로 같은 TX 를 공유 할 수는 없겠죠 그래서 각각 따로 TX 를 전송을 합니다. 이떄 session 을 사용하냐 안하냐로 갈리게 되는데, 일반적으로 session 을 사용하면 정합성이 더 보장이 될 겁니다. 여러개의 TX 중에 하나만 실패해도 모두 실패로 간주 할 것이기 떄문에 하지만 여러 서비스에서 Session 을 사용을 하려면 TX에 대한 격리 단계를 수정 해야 하는 필요가 있어요. 이는 MySQL 에서 다루는 Lock 이라는 개념을 수정해야 하기 때문이죠 이렇게 격리 단계를 수정하게 되면, 일반적으로 성능에 큰 영향이 가게 됩니다. 그래서 저는 따로 수정은 하지 않았고 최대한 쿼리에서 최적화를 진행을 하였습니다. 앞서 말한 Prepared Query, Bulk 를 주로 사용을 하고 있습니다. 상황에 따라서는 Load Data 라는 방법도 있는데, 이는 실제 모듈이나 서버에서는 사용이 되지 않는 형태이기는 합니다. 쩃든 결론은 그냥 Prepared, Bulk 를 사용하라가 제가 말씀드리고 싶은 내용이 될꺼같네요. 제가 혹시 질문을 잘 이해하지 못하였다면, 다시 질문 남겨주시면 검토하고 답변을 해보도록 하겠습니다. 감사합니다!
- 1
- 1
- 30
질문&답변
2024.05.27
채팅 메시지 DB로 저장 하기.
사실 DB를 선택하는 부분에 대해서는 큰 정답은 없습니다. 일반적으로 유저들이 직접적으로 전송을 하여 데이터를 생성하는 경우와 같이 이런 서비스 측면에서는 보통 RDB를 사용합니다. 대표적으로 MySQL이 있죠 이러한 이유는 굳이 관계를 설정하지 않는다고 해도, 데이터 관리나 서비스 내에서 추가적인 기능에 대해서 데이터를 불러오는 것이 더 쉽기 때문입니다. MongoDB같은 NoSQL같은 경우에는 쿼리상에서 사용해야 하는 부분이나, 이렇게 지속적으로 무한히 증가하는 데이터에 대해서 관리를 하기가 어려워요 - 관리를 하기가 어렵다는 부분이 다른 컬렉션에서 이런 채팅 데이터를 참조하는 경우를 말을 합니다. - 일반적으로 MongoDB에서는 Lookup, MySQL에서는 Join을 의미합니다. MongoDB측에서는 다른 컬렉션에 대해서 참조를 하는 쿼리가 굉장히 리소스를 많이 잡아먹고 느린 쿼리로써 동작이 됩니다. 그래서 만약 제가 구현을 한다면 RDB를 사용 할 꺼 같습니다. 하지만 이는 개발자마다 생각이 다른 부분이라서 정답은 없을 꺼 같아요. - PostgreSQL 같은 DB도 있으니 알아보시면 좋을꺼 같습니다. 추가로 비용적인 측면도 고려를 해야 하는 부분도 있겠죠, PostgreSQL > mongoDB > mysql 순서로 비용이 비싸며, 이는 메모리로 동작을 하냐, 추가적으로 고가용성을 보장하냐 등으로 차이가 나게 됩니다.
- 1
- 1
- 38
질문&답변
2024.05.26
1탄과 2탄 사이 변경된 코드 질문
한번 확인을 해보도록 하겠습니다. 일부 안쓰이는 코드나 좀 더 짜임새 있는 코드를 위해 함수를 분리를 했을수도 있을꺼 같습니다. 확인 후 변경점이 크다면 공지로 전달드리도록 하겠습니다. 감사합니다!
- 1
- 1
- 44
질문&답변
2024.05.21
안녕하세요 강의 잘 보고 있습니다.
안녕하세요 수강생님 반갑습니다. 👋 👋 일단 수강하시는데에 있어서 만족을 드리지 못한거 같아서 너무 죄송스럽네요 ㅠㅠ 🤒 일단 제 강의는 대본이 없이 100% 제가 처음부터 찍어가며 촬영이 되는 강의입니다. 그렇다보니 말을 하다보면 생각보다 기억이 나지 않는 경우가 상당히 많아요. 저희가 개발에 대해서 암기보다는 기록을 하며 중간중간 필요할때마다 개발을 하기 때문에 이러한 부분에서 만족감을 많이 드리지 못한거 같네요... 너무 죄송스럽습니다. 😓 해당 방식은 어느정도 의도를 하여 진행하였던 방식입니다. 처음부터 모든것을 보여주며 모든것을 알려주지말자 제가 강의를 시작하면서 다짐했던 가치관입니다. 개발 초기 단계부터 이후 디버깅 이후 이런것이 있다 그러니 알아보시라 대부분의 강의가 이렇게 구성이 되어있어요. 개발은 공부의 연속입니다. 그래서 공부하는 방법을 길러드리고 싶었고 그래서 최대한 디테일한 부분은 배제를 하였습니다. 어느정도 제 가치관이 전달이 되었기를 바라며 다시한번 강의를 듣는데에 있어서 불편함과 만족을 드리지 못해서 너무 죄송스럽습니다. 긴 글 읽어주셔서 감사합니다.
- 1
- 1
- 60
질문&답변
2024.05.20
채팅이 2번씩 전송되는 현상 질문
안녕하세요 👋 메시지가 두개씩 나오는 이유로 질문을 주셨습니다. 소스를 확인해보니 의심할 부분이 보이는거 같아요. Read함수를 보시면 Forward에 두번 전송을 하고 있습니다. 그러면 채널이 두개의 값을 전달받아 처리가 될 우려가 있어요!! 🤔 🤔 그러니 한번의 전송만 진행하게 코드를 수정해보시면 어떨까싶네요. 🎉 한번 진행해보시고 해결이 안된다면 다시 질문 부탁드립니다. 늦은시간까지 열심히 하시네요!! 화이팅 👏
- 1
- 1
- 58
질문&답변
2024.05.15
소스코드 깃 제공 문의
안녕하세요 ram님! 우선 강의 들어주셔서 감사합니다! 😃 강의를 들으시는데에 있어서, 코드상의 불편함이 있으신가보네요 ㅠㅠ 아마도 다른분들도 꽤 있으실수도 있는 문제라고 생각을하여, 커리큘럼을 추가하여 마지막에 소스코드 파일을 업로드 해두도록 하겠습니다!! 😃 하지만 제가 목표하는 강의는 기본적으로 소스코드를 제공을 안해드리는걸 목표로 하고 있어요! 그러니 정말 이해가 안되시는 경우에만 확인을 하시면서, 공부해보시면 좋을꺼 같아요!! 질문 남겨주셔서 감사합니다! 좋은하루 되세요! 😍
- 1
- 1
- 62
질문&답변
2024.05.02
hello world 가 2번 뜨는 이유가 뭘까요?
response에서 오는 응답이 아닌 서버의 로그로써 두번이 뜬다면 가장 쉽게 의심가능한 부분은 fmt 또는 log로 시작하는 코드를 한번 검색해보시면 좋을 꺼 같아요!! 😁 😁 분명히 해당 라우터의 경로에 이런 로그를 찍는 코드가 두번 들어가있어서 그렇습니다. 한번 확인해보시고 또 문제있다면 알려주세요!! 🙏
- 1
- 1
- 77
질문&답변
2024.05.02
UserRouter 질문
네 싱글톤 패턴이라고 보셔조 무방할꺼 같아요. 👋 Golang이라는 언어에서는 이러한 패턴을 굳이 숙지하지 않는 언어기는 하지만 거의 같은 역할을 수행하니 무방할꺼 같아요. 😁 일단 기본적으로 router가 여러번 호출이 된다면 서버가 실행이 안될거에요. 프레임워크 딴에서 중복된 라우터 이슈가 발생을 할 겁니다. 이거는 버전에 따라 다를 수 있는데 기본적으로는 그렇습니다. 그러니 실수로 두번 등록을 하시는거에 대해서는 큰 걱정을 안하셔도 됩니다. 실무에서도 두번 등록을 하는 경우는 없어요. 저도 못봤고 저도 그런 휴먼 에러는 해본적이 없어서
- 1
- 1
- 67
질문&답변
2024.05.01
그래서 바뀐거 언제적용해요 ㅋㅋ?
소스코드를 도저히 찾기가 어려워 빠르게 강의에 대한 차이점을 확인 후 관련하여 영상을 추가로 업로드 해두었습니다. 다시한번 불편을 드려서 죄송합니다.
- 0
- 2
- 96
질문&답변
2024.05.01
그래서 바뀐거 언제적용해요 ㅋㅋ?
안녕하세요. 강의를 보시는데에 있어서 어려움을 드려 너무 죄송합니다. 제가 다른 업무를 보다보니 해당 부분을 챙기지못하였네요.. 빠른시일내로 확인 후 공지를 통해 소식 전달드리도록 하겠습니다. 우선적으로 literal.go 파일은 일반적인 const, var 같이 상수 변수를 관리하기 위한 파일이라고 보시면 됩니다. 그래서 원하는 상수값들을 정의내려서 사용하신다고 보시면 됩니다. 추가로 해당 코드에서 service.go 에서의 NewService 함수의 파라메터 값들이 수정이 되었는데, difficulty 라는 필드가 추가 되었습니다. 이 difficulty 값은 string 값으로 그냥 블록 채굴에 대한 난이도를 넘겨주는 인자라고 보시면 됩니다. 그러니 원하는 채굴 난이도 값을 넘겨주시면 됩니다. 현재 잠시 하드디스크 파일이 날라가는 상황이 발생하여, 저도 소스를 보관함을 찾아가고 있는 상황이라서.. 빠른시일내에 공지로 다시한번 전달드리도록 하겠습니다. 다시한번 강의 보시는데에 있어서 불편을 드려 죄송합니다.
- 0
- 2
- 96