안녕하세요, 강사님. 강의를 통해 많은 도움을 얻고 있는 수강생입니다. 강의 내용 중 스레드 경합과 관련하여, 제가 확인한 공식 문서의 내용과 차이가 있는 부분 이 있어 명확히 이해하고자 질문을 남깁니다. 강의 내에서는 "하나의 인스턴스에 존재하는 메소드를 여러개의 스레드가 호출하는 경우 해당 매소드 호출에 따른 경합이 발생할수 있다" 라고 말씀하셨는데 공식문서 상에는 " synchronized 예약어 존재하는 경우에만 락이 발생 한다" 설명하고 있어 아래의 문의드립니다. 혹시 강의 상의 경합이 synchronized 예약어가 존재하는 경우를 한정해서 말씀하신걸까요? 만약 일반적인 경우라면 강의상에서 언급하신 스레드별 로컬변수 처리되어 경합처리가 발생하지 않고, 인스턴스의 지역변수인 경우는 락에 대한 처리가 되지 않을것 같은데 혹시 다른 상황을 가정하신 걸까요? 감사합니다. 참고 문헌 : https://docs.oracle.com/javase/specs/jls/se21/html/jls-14.html#jls-14.19 - synchronized가 있는 경우에만 monitorenter 코드가 생성됨 https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-3.html#jvms-3.14 https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-6.html#jvms-6.5.monitorenter - monitorenter 코드가 존재하면 object 락이 생성됨
학습관련 질문을 남겨주세요! 상세히 작성주시면 더 좋아요 🙂 안녕하세요, 재밌는 강의 만들어주셔서 감사합니다! 저는 먼저 구현 후, 강사님의 강의를 보며 리팩토링을 진행하고 있습니다. 제가 궁금한 것은 강사님은 external 모듈에서 naver/kakao 를 하위 모듈로 분리하셨는데, 저는 external 하위에 kakao 패키지, naver 패키지로 분리했었습니다. 그래서, 모듈로 분리하신 이유가 무엇인질 고민하다가 naver 와 kakao 의 수정되는 주기가 달라서 빌드/배포에 이점이 있겠다는 생각이 들었는데 강사님은 어떤 기준으로 모듈과 패키지를 선택하시는지 질문 드립니다.
for문과 if문을 통해 가장 첫번째 달성하는 순간 return(i,j)까지는 이해 했는데요. 해당 코드를 봤을때, 첫번째 i for문과 두번째 j for문이 있는데 가장 밖에 return -1은 첫번째 i for문에 return이 아닌 함수 fp(arr)의 return으로 봐야하는건가요? i for문과 j for문에 해당하는 리턴값이 없을경우에 영향을 미치는 걸까요? return(i,j) 값을 받아 함수를 탈출할때, return -1은 영향이 없는지 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 영한님. 프로젝트 환경설정 - JPA와 DB 설정, 동작확인 오탈자 제보합니다. 강의에서는 Spring을 사용하고 있기 때문에 Spring의 org.springframework.transaction.annotation.Transactional 을 사용하셨지만 수업자료는 jakarta.transaction.Transactional 을 사용하고 있습니다. [1. 프로젝트 환경설정 | JPA와 DB 설정, 동작확인] import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import 문 수정 내용입니다. 감사합니다.
'섹션 1. 1장 스프링 부트 개발 준비하기' - '1. JDK와 STS설치, 웹 서비스의 동작 원리, Spring Boot Devtools과 롬복 설치 등' 관련된 내용 입니다. 'LiveReload++'가 '이 확장 프로그램은 Chrome 확장 프로그램 권장사항을 준수하지 않으므로 더 이상 지원되지 않습니다.'라고 뜨면서 '크롬에 추가' 버튼이 비활성화 되네요. 혹시 LiveReload++와 비슷한 대체할만한 게 있나요?
안녕하세요. 인덱스를 활용한 조회 성능 개선을 공부하던 중 궁금한 점이 생겨 질문드립니다. 현재 저는 OFFSET 기반 pagination을 사용하는 서비스 를 개발하고 있으며, 다음과 같은 환경에서 성능 테스트를 진행했습니다. 데이터: 약 1,000만 건 서버: EC2 t3.small DB: RDS t4g.micro k6 vus100 1. 문제 상황 초기에는 OFFSET 제한 없이 마지막 페이지까지 이동 가능하도록 구현했습니다. 하지만 데이터가 1,000만 건 수준으로 증가하자, 깊은 페이지로 갈수록 조회 속도가 급격히 느려지는 문제 를 확인했습니다. 2. 고민 및 제약 일반적으로 이 문제는 Keyset Pagination(커서 기반) 으로 해결하라고 많이 알려져 있습니다. 하지만 제 서비스는 👉 네비게이션 바를 통한 페이지 직접 이동 (ex. 1, 10, 100 페이지 클릭) 이 필요하기 때문에 Keyset 방식만으로는 요구사항을 만족시키기 어렵다고 판단했습니다. 3. 적용한 개선 방법 다음과 같은 방식으로 성능 개선을 진행했습니다. OFFSET 최대 범위를 제한 (최대 10,000 페이지 / OFFSET 100,000) 커버링 인덱스 적용 조회 방식 개선 먼저 ID만 조회 → 이후 필요한 10건만 상세 조회 전체 게시글 수(count)는 캐싱 처리 4. 성능 개선 결과 [Page 10] avg: 1.4s → 700ms p95: 4.5s → 1.8s [Page 100] avg: 17s → 1.18s p95: 24s → 3.3s [Page 1000] avg: 32.1s → 1.7s p95: 59s → 4.27s 5. 추가 제약사항 로그인 사용자와 비로그인 사용자의 조회 결과가 다름 (사용자별 구독 게시글이 포함됨) 따라서 캐시는 비로그인 사용자에만 적용 위 성능 수치는 로그인 사용자 기준 6. 현재 고민 위와 같이 개선했지만, 👉 여전히 성능이 충분하지 않다고 느끼고 있습니다. 특히 궁금한 점은 다음과 같습니다. 7. 질문 OFFSET 기반 pagination을 유지하면서 👉 추가로 성능을 개선할 수 있는 방법이 있을까요? 다음과 같은 방법들을 고려했는데, 방향성이 맞는지 궁금합니다. RDS를 2개를 사용하여 조회 성능 데이터를 각각 2개의 db가 처리하도록 한다? Keyset + OFFSET 혼합 방식 ( 일반적인 페이지 이동은 Keyset Pagination을 사용하고, 사용자가 특정 페이지를 직접 입력하거나 점프하는 경우에만 제한적으로 OFFSET 기반 조회를 사용하는 혼합 방식) RDS 스펙 업그레이드 또한 에펨코리아( https://www.fmkorea.com/ )와 같은 대형 커뮤니티는 제가 원하는 페이지 네이션 방식을 사용하면서 깊은페이지(최대 1만)도 지원하고 동시접속자 수십만 페이지 수천~수만 대량 데이터 환경에서도 빠른 조회 성능을 유지하는데 👉 이러한 서비스들은 어떤 방식으로 pagination 및 조회 성능을 처리하는지 궁금합니다.
select o from Order o where o.orderAmount > ALL(select p.stockAmount from Product p) ALL 예제가 강의록에 위와같이 되어있던데요. 이게 아래 sql 문처럼 서브쿼리에 MAX 적용한 거랑 동일한 결과를 내는 걸까요?? select o from Order o where o.orderAmount > (select MAX(p.stockAmount) from Product p)
다차원 배열과 문자열 배열 21:45 다차원 문자열 배열에서 포인터 변수 관련으로 질문이 있습니다. *arr[2][2]={{"Hello", "World"}, {"app", "dev"}} 이렇게 2차원 문자 배열이 있을 때 printf("%c\n", arr);의 답은 arr의 초기값으로 H인지 아니면 Hello인지 궁금합니다. 그리고 arr+1 또는 arr ++ 하면 다음 주소로 이동하는 값을 나타내는 것이라고 하는데 그러면 답이 e인지 아니면 World인지 궁금합니다.
다차원 배열과 문자열 배열 1:14 예를 들어, {2, 4, 8, 10, 12} 라는 배열이 있을 때 포인터 p 변수 경우 *(p+4)를 하면 12가 답이 됩니다. 하지만 아래와 같이 다차원 배열 일 때 {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}} *(p+4)를 하면 답이 어떻게 되는지 궁금합니다.
안녕하세요! 좋은 강의 감사합니다! 제가 1년 동안 기획하고 개발해서 플레이 스토어에 출시한 커뮤니티 앱이 있습니다. 그 후 6개월동안 꾸준히 업데이트하고 관리해서(코드 13만줄, 앱 계속 운영중) 현재 1300다운로드, 리뷰 80개를 달성했는데, 이제 취업을 하려고 하니 차라리 적당히 하고, 다른 스펙 쌓는 게 나았을까 생각이 드네요 저의 성과가 어느 정도 가치가 있는지 솔직한 평가가 궁금합니다. 앱 개발에 너무 몰두하다 보니 다른 팀 프로젝트나 자격증이 부족하다고 느껴져서 만약 그렇게 큰 가치가 없다고 하면 부트캠프를 지원하거나 해서 팀 프로젝트를 쌓고, 가치가 있다고 하면 코테에 몰두하려고 합니다 정말 솔직한 말씀 부탁드립니다!
함수와 재귀함수(v2) 22:15 void printString(char *str){ printf("입력된 문자열: %s\n", str); } int main(){ char myString[] = "this is string"; printString(myString); return 0; } 위 구문에서 void 구문 중 char *str 부분에서 설명으로 myString을 가리키는 주소 값 중 1번째를 가리킨다고 하는데 t가 아니라 왜 this is string 배열 전체를 의미하는지 이해가 되지 않습니다.
섹션[6] 66.[출제유형] 거리측정, 최단거리 페이지 오타 방법 2) 큐에 거리 정보까지 함께 저장하는 방식 ✔ visited를 사용한 구현 코드 설명에 visited 코드 예시가 아니라 아래 설명되어있는 distance와 동일한 코드 예시로 되어있습니다. visited로 활용하는 코드로 변경 필요할 것 같습니다. 현재 노션도 이와 동일하게 되어있습니다..!
포인터 조작과 출제 패턴(2. 포인터 중가/감소, 이중 포인터) 9:40 포인터 값 관련하여 예를 들어 배열 값이 5, 7, 9, 11, 13일 경우 *(ptr_a + 1) 출력값에 대해서는 초기 인덱스 [0]의 값 5에서 포인터 위치를 1칸 오른쪽으로 이동 후 해당 값에 대한 것을 적는것으로 확인이 되는데 그러면 답은 7이 될 겁니다. 지금 강의를 보면 ++이나 +1에 대해서는 값을 더하기 1하는 것이 아닌 포인터 위치를 오른쪽으로 1칸 이동시키는 것만 나오는 것 같은데 값 자체를 1증가시크는 것과 포인터 위치를 1 오른쪽으로 이동하는 것 관련하여 어떻게 구분하는지 모르겠습니다.