안녕하세요. 분산락을 언제 쓰는게 좋을지 고민하다가 몇 가지 궁금증이 생겨 질문드립니다. 분산 DB 환경이 무엇을 의미하는지? 흔히 분산 DB 환경에서 낙관적, 비관적 락으로 동시성 문제를 해결하기 힘들다고 얘기하더라고요. 여기서 말하는 분산 DB 라는 것이 샤딩에 의해 여러 DB 서버가 있는 것인지, 동일한 데이터를 저장하는 DB 서버가 여러 대 있는 환경을 의미하는 것인지 모르겠습니다. 예를 들어, Ticket 이란 데이터를 저장하는데 동일한 ticket 데이터가 DB server 1, DB server 2 에 저장되어 있는 환경일까요?? 만약 분산 DB 가 샤딩인 경우 비관적 락으로도 동시성 이슈를 해결할 수 있을 것 같은데 맞을까요? 아래 그림처럼 ticketId = 1 인 티켓을 예매하기 위한 요청이 동시에 올 경우 입니다. 처음 x-lock 을 잡은 요청이 끝나야 뒤늦게 온 요청이 해당 티켓의 잔여 수량을 확인하고 예매 하기 때문에 샤딩으로 인한 분산 DB 에서는 비관적 락으로 동시성 이슈를 해결할 수 있을 것 같습니다. 동일한 Ticket 데이터가 여러 DB 서버에 중복되어 저장된 분산 DB 환경에서는 분산락을 사용해야 될 것 같습니다. 그러나, 샤딩은 동일한 Ticket 데이터에 접근하기 위해서는 동일한 서버로 접근하기 때문에 비관적 락으로도 충분히 해결 가능할 것 같아서 질문 드립니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 강의에서는 warn이 뜨고 name이 없다라는 콘솔문구가 뜨는데 저는 창을 들어가보면 에러는 똑같이 나는데 warn이 안뜨네여..
안녕하세요 영한님, 정말 좋은강의 잘 듣고있습니다. Merge관련해서 질문이 하나있는데요..! 아래 두 method 모두 시작할때 persistence context가 비어있고 찾는 entity가 db에 있다고 가정할때 비슷한 (혹은 같은) flow로 진행될까요? 여기서 method parameter, Entity e,는 업데이트될 (id가 set되어있고 field가 업데이트 되어있는)객체입니다. @Transactional public void updateEntity(Entity e){ Entity foundEntity = em.find(Entity.class, e.getid()); foundEntity.setFieldOne("New Data"); } @Transactional public void updateEntity(Entity e){ em.merge(e); } Merge를 꼭 써야하는건 아니지만, 그냥 동작 메커니즘이 궁금해서 질문드립니다. Merge를 쓰는게 Update전에 항상 Select query로 db에서 객체를 조회하기때문에 쓰기를 지양하라고 하시는건가요, 아니면 merge를 쓸때 또 다른 downside가 있나요?
따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
docker-compose up을 사용하면 initdb: error: directory "/var/lib/postgresql/data" exists but is not empty initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data". 라는 오류가 자꾸 발생합니다. 삭제하고 다시 해도 해결이 안되서 질문남깁니다. 어떻게 해결해야하나요.
loadUserByUsername 메서드에서 username 으로 조회잘되고 조회된 MemberDto는 log 출력도 잘되는데 다음 단계에서 "Encoded password does not look like BCrypt" 라는 warn 과 함꼐 "Failed to process authentication request" 로 자격증명에 실패했다고 합니다. DB의 패스워드는 암호화 되어 잘 저장된거 확인됩니다 제가 무언가를 잘못 작성한건지 파라미터로 보낸 password 는 어디서 encode해야 하는건지 아니면 다른 문제가 있는건가요?
섹션 4. 회원 도메인 개발-회원서비스 개발에 대해 질문있습니다. 테스트 junit으로 테스트 실행시 아래와 같은 에러가 나옵니다. Execution failed for task ':test'. > No tests found for given includes: [jpabook.jpashop.Service.MemberServiceTest](filter.includeTestsMatching) package jpabook.jpashop.Service; import static org.junit.Assert.*; import jpabook.jpashop.domains.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; //메모리db로 test import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(savedId)); } // @Test // public void 중복회원예외() throws Exception { // //given // // //when // // //then // // } } 에러 사항을 찾아보니 디렉토리 위치가 다를 경우에 에러가 날 수 있다고 하여 디렉토리 위치를 비교해봐도 같습니다. junit테스트도 동일합니다. 어느 부분이 틀린지 알 수 있을까요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예 [질문 내용] 스프링 cascade 활용도 측면에서 궁금한 것이 있습니다. 영한님 - 인프런 (inflearn.com) 이 질문을 남겼었던 수강생입니다! 잠깐 상황을 요약하면 Program 과 Review 그리고 User 가 다대 1 1대 다 로 묶여 있는 상황입니다. program 에서 program.addReview 메서드를 활용하기 위해 cascade type 을 적용하였었습니다. 하지만 영한 님은 이부분의 코드는 별로 좋은 코드가 아니다! cascade 옵션 질문 - 인프런 (inflearn.com) 를 참고해서 보아라. 라고 하셨습니다. 위 질문의 요약은 강의에서 Order 는 OrderItem 을 개인 소유 하나, Order 와 Delivery 는 Delivery 가 여러 곳에서 참조할 수 있으므로 개인 소유 하지 않는다. 라고 읽었습니다. 참조 하는 것과 Cascade Type .all 이 무슨 관계가 있는지 모르겠습니다. 6줄요약하면: Delivery 와 Review 는 여러 곳에서 참조할 수 있으므로 CascadeType all 을 붙이지 말라고 하신 것 같은데 여러 곳에서 참조가능성이 있으면 CascadeType all 을 왜 붙이지 말아야 하는지 궁금합니다. 단순히 계속 코드를 보며 추적해야 하는 것 때문인가요?? 이 부분이 와닿지 않습니다. 혹시 실제 예를 들어 설명해주실수 있나요??
https://www.inflearn.com/questions/1199599/m1-mac-도커-컴포즈-docker-compose-up-에러 안녕하세요 이전에 docker-compose에서 flyway를 띄울 때 오류가 있어 질문을 드렸습니다. 말씀해주신대로 버전을 변경해서 실행을 하니 해당 오류는 발생하지 않으나 다른 에러가 발생하였습니다. ERROR: Unable to instantiate JDBC driver: com.mysql.cj.jdbc.Driver => Check whether the jar file is present Caused by: Unable to instantiate class com.mysql.cj.jdbc.Driver : com.mysql.cj.jdbc.Driver Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 나름대로 구글링해본 결과 직접 jdbc 파일을 넣어주어야 한다고 하는데 이렇게 하는게 맞을까요? flyway의 github에 들어가서 compose 파일을 확인하니 alphine 리눅스로 되어 있던데 jdbc driver jar파일을 다운받으려고 사이트를 들어가니 알파인 리눅스용 드라이버는 없던데 어떻게 해야할까요? 강사님으로부터 flyway를 처음 알게되었는데 유용할 것 같아 넘어갈 수 있는 부분이지만 다시 질문드리게 되었습니다. 감사합니다.
조은님 안녕하세요 🙂 강의 잘 보았습니다! 강의를 보다가 문득 궁금한 점이 있는데요! import 문 통해서 절대경로로 파일을 불러올 때, 전역에 있는 tsconfig.json 내에서 파일별로 일일이 수동 설정을 해주어야하는 걸로 아는데 조은님께서는 자동으로 @가 붙여진 형태로 불러와지는 거 같아서요! 혹시 따로 설정 어떻게 하셨는지 여쭤봐도 괜찮을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 이게 현재 프로젝트 이고 plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } //querydsl 추가 시작 def querydslDir = file('build/generated/querydsl') querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } 현재 gradle설정인데 Querydsl 설정과 검증 부분에서 막혔어요 클린해서 q파일 지우고 테스트 코드 런하면 아래 에러가 나타나고 error: Attempt to recreate a file for type study.querydsl.entity.QHello 이후에 q파일이 생성 된 후에는 error: Could not find class file for 'study.querydsl.entity.Hello'. 에러가 반복되네요.. https://www.inflearn.com/questions/1086099 다른분들 설정파일 따라해도 안됩니다..
안녕하세요. 현재 react 로 구성되어 있는 프로젝트를 next.js 로 마이그레이션 하기 위해 강의 신청해서 들었습니다. 마이그레이션 도중 질문이 있어서 글 남겨봅니다. 1) 기존 react 에서 navigate 의 state 값으로 전달하던 데이터 들이 있습니다. 전달된 데이터는 location state 로 가져와서 사용했구요. 2) next 12 버전 까지는 query 에 객체를 담아서 보낼수 있고 url 도 as 를 이용해서 제어할 수 있는걸 확인했습니다. 3) 하지만 13버전 이후부터 next/router -> next/navigate 로 변경되면서 query 객체, as 가 삭제되어진 걸로 확인되는데 페이지 이동시 데이터를 전달하러면 url 에 그냥 꼬라박는 방법 뿐인지 질문 드립니다.
안녕하세요 강사님 현재 스프링부트 3.2.2 버전을 사용하고 있습니다. 배운대로 개인적인 프로젝트에 적용해보고 있는데 @Around 애노테이션의 메서드 실행이 @GetMapping일 경우에는 AOP가 잘 작동하나 @PostMapping일 경우에는 작동하지 않고 @Validation 애노테이션에서 오류가 먼저 터집니다.. 무슨 문제일까요..? .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<?> com.board.www.app .board.controller.api.BoardApiController.create( com.board.www.app .board.dto.BoardDto,org.springframework.web.multipart.MultipartFile) with 2 errors: [Field error in object 'dto' on field 'content': rejected value []; codes [NotBlank.dto.content,NotBlank.content, NotBlank.java .lang.String,NotBlank]; arguments [ org.springframework.context.support .DefaultMessageSourceResolvable: codes [dto.content,content]; arguments []; default message [content]]; default message [내용을 입력해 주세요]] [Field error in object 'dto' on field 'title': rejected value []; codes [NotBlank.dto.title,NotBlank.title, NotBlank.java .lang.String,NotBlank]; arguments [ org.springframework.context.support .DefaultMessageSourceResolvable: codes [dto.title,title]; arguments []; default message [title]]; default message [제목을 입력해 주세요]] ]
섹션3 recoil을 테스트하는 방법 3:50에 cy.url().should('include','/'); 를 통해서 root page로 잘 이동하는지 확인한다고 하신부분에서, '/' 는 어떤 페이지에서든 include가 되어 테스트가 통과될것 같은데 혹시 rootpage를 검증하기위한 다른 방법은 없을까요?
docker compose up -d [+] Building 0.0s (0/0) docker:desktop-linux [+] Running 4/4 ✔ Network local_default Created 0.0s ✔ Container local-local-db-1 Started 0.1s ✔ Container local-local-db-migrate-1 Started 0.1s ! local-db-migrate The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 0.0s 안녕하세요 강의 잘 듣고 있습니다. 강사님께서 주신 설정 파일을 토대로 동일하게 복사, 붙여넣기를 하고 경로도 동일하게 했는데 위와 같은 에러가 나오고 있습니다. DB에 접속은 되는데 안에 초기 데이터가 들어가지를 않는데 어떤게 문제이고 어떻게 해결할 수 있을까요?
public class Animal { public void sound(){ System.out.println("동물 울음 소리"); } } public class Dog extends Animal{ @Override public void sound() { System.out.println("멍멍"); } } public class BabyDog extends Dog{ public void sound() { System.out.println("낑낑"); } } public class AnimalPolyMain1 { public static void main(String[] args) { Dog dog = new Dog(); BabyDog babyDog = new BabyDog(); soundAnimal(dog); soundAnimal(babyDog); } private static void soundAnimal(Animal animal){ System.out.println("동물 소리 테스트 시작"); animal.sound(); System.out.println("동물 소리 테스트 종료"); } } 안녕하세요. 강의 중 추가적으로 궁금한게 생겨서 질문드립니다. 그림에 따르면 코드에 만약에 제가 BabyDog클래스를 만들어서 Dog를 extends 한 후 오버라이딩을 하지 않고 매서드를 생성하면 "낑낑"이 아닌 매서드 오버라이딩이 된 "멍멍"이 출력되어야 하는 거 아닌가요??
[질문] 제가 담당했던 업무에서는 Long 값을 비교하는 일이 거의 없어서 이 챕터에서 생각을 못 했었던 부분을 알게 되어 좋았습니다. 관련 자료를 찾아보다가 equals 메서드에서는 Long 타입일 경우 .longValue();로 체크하는 로직을 보게되었습니다. public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; } 은행권 같은 실무에서는 equals와 longValue 둘이 어떻게 사용하는지 궁금합니다. [참고 자료] https://www.baeldung.com/java-compare-long-values