묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
accountTransferEX 에서 assertThatThrownBy 사용하는 이유
accountTransferEX 에서 assertThatThrownBy를 주석처리하고 @Test @DisplayName("이체중 예외 발생") void accountTransferEX() throws SQLException { Member memberA = new Member(MEMBER_A, 10000); Member memberEx = new Member(MEMBER_EX, 10000); memberRepository.save(memberA); memberRepository.save(memberEx); // assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) // .isInstanceOf(IllegalStateException.class); memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000); Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberEx.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberB.getMoney()).isEqualTo(10000); } }accountTransfer 에서 throw new IllegalStateException(e)를 주석처리했습니다.public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try{ con.setAutoCommit(false); bizLogic(con, fromId, toId, money); con.commit(); }catch (Exception e){ con.rollback(); //throw new IllegalStateException(e); } finally{ release(con); } }제가 생각했을 때는 어차피 예외가 터지면 롤백할거니까 예외(IllegalStateException)를 걍 먹고(?) 끝내버리면 된다고 생각하는데 assertThatThrownBy를 이용하는 이유는 예외가 발생할 수 있는 코드가 있다는 것을 인지하기 위해서인가요??답변 주시면 정말 감사하겠습니다.
-
해결됨스프링 부트 - 핵심 원리와 활용
액츄에이터 - 애플리케이션 정보의 build 출력 질문입니다.
(환경 : Windows 10, Java 17, SpringBoot 3.0.2)안녕하세요. 액츄에이터 - 애플리케이션 정보(info)에서 build 정보를 출력하는 것 관하여 질문이 있습니다.build.gradle에 buildInfo()를 추가하고 애플리케이션을실행하면 resources/main/META-INF/build-info.properties 파일을 확인할 수 있다고 하셨는데, 저는 만들어지지 않았습니다. (META-INF 디렉토리 자체가 없었습니다)build and run이 IntelliJ로 되어 있어서 그런 것 같아 Gradle로 변경하여 실행하니 에러가 발생했습니다. finished with non-zero exit value 1우선 해당 경로를 확인하니 build-info.properties가 생성되어 있었습니다. 생성된 것을 확인하고, 에러를 해결하기 위해 build and run을 IntelliJ로 바꾸고 실행했습니다. info를 요청하니 build 정보는 여전히 출력되지 않았습니다. 이 문제를 어떻게 해결할 수 있을까요?항상 좋은 강의 감사합니다.
-
해결됨실전! 스프링 데이터 JPA
[스프링 데이터 JPA 페이징과 정렬] left join 쿼리
MemberRepositorypublic interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findMemberByUsernameAndAgeGreaterThan(String username, int age); ... @Query(value = "select m from Member m left join m.team t", countQuery = "select count(m.username) from Member m") Page<Member> findByAge(int age, Pageable pageable); } MemberRepositoryTestpackage hello.datajpa.repository; ... @SpringBootTest @Transactional @Rollback(false) class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired TeamRepository teamRepository; ... @Test public void paging() { for (int i = 1; i <= 5; i++) { Member member = new Member("member" + i, 10); memberRepository.save(member); } int age = 10; PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); Page<Member> page = memberRepository.findByAge(age, pageRequest); List<Member> content = page.getContent(); long totalElements = page.getTotalElements(); int totalPages = page.getTotalPages(); int currentPage = page.getNumber(); boolean isFirst = page.isFirst(); boolean hasNext = page.hasNext(); assertThat(content.size()).isEqualTo(3); assertThat(totalElements).isEqualTo(5); assertThat(totalPages).isEqualTo(2); assertThat(currentPage).isEqualTo(0); assertThat(isFirst).isTrue(); assertThat(hasNext).isTrue(); } } Memberpackage hello.datajpa.entity; ... @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) /*@NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username" )*/ public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username, int age) { this.username = username; this.age = age; } public Member(String username, int age, Team team) { this.username = username; this.age = age; changeTeam(team); } public void changeTeam(Team team) { if (team == null) throw new RuntimeException("Member.changeTeam: team is null"); this.team = team; team.getMembers().add(this); } } 쿼리select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 order by m1_0.username desc offset ? rows fetch first ? rows only select count(m1_0.username) from member m1_0강의와 다르게 left join을 해도 left join 관련 쿼리가 나가지 않는데 뭔가 강의와 다르게 설정된 부분이 있는 걸까요?@SpringBootTest @Transactional @Rollback(false) class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Autowired TeamRepository teamRepository; ... @Test public void paging() { Team team = new Team("A"); teamRepository.save(team); for (int i = 1; i <= 5; i++) { Member member = new Member("member" + i, 10); member.changeTeam(team); memberRepository.save(member); } int age = 10; PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); Page<Member> page = memberRepository.findByAge(age, pageRequest); List<Member> content = page.getContent(); assertThat(team).isSameAs(content.get(0).getTeam()); // team == content.get(0).getTeam() ? long totalElements = page.getTotalElements(); int totalPages = page.getTotalPages(); int currentPage = page.getNumber(); boolean isFirst = page.isFirst(); boolean hasNext = page.hasNext(); assertThat(content.size()).isEqualTo(3); assertThat(totalElements).isEqualTo(5); assertThat(totalPages).isEqualTo(2); assertThat(currentPage).isEqualTo(0); assertThat(isFirst).isTrue(); assertThat(hasNext).isTrue(); } } 테스트 코드를 위와 같이 변경했을 때 left join 쿼리나 select 쿼리가 나가지 않고 assertThat(team).isSameAs(content.get(0).getTeam()) 테스트는 통과됩니다.위 코드는 이런 식으로 동작하는게 맞을까요?fetch join이 아니기 때문에 하이버네이트는 일단 member만 가져오는 쿼리를 날리고 레코드를 받아온다.받아온 레코드와 영속성 컨텍스트를 비교한다.받아온 레코드가 영속성 컨텍스트에 엔티티로 존재하므로 영속성 컨텍스트에 있는 엔티티를 반환한다.따라서 조회한 content.get(0) 객체에는 team 필드가 이미 할당 되어 있다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 MVC 구조에서 핸들러 어댑터는 어디 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님. 강의 아주 재밌고 유익하게 보고 있습니다. 감사합니다!16분 25초에 스프링 MVC 구조가 완성되었다고 말씀하셨습니다.@Controller, @RequestMapping 애노테이션을 사용해서 빈 객체로 등록하고 해당 URL로 요청객체가 들어오면 해당 빈 객체의 process 메서드를 호출하는 과정 즉, 핸들러매핑이 된 것은 이해가 갔습니다.하지만 핸들러 어댑터 목록을 조회하고 그 어댑터가 핸들러를 지원하는지 확인하는 로직은 구현하지 않으신 것으로 이해했습니다. 심지어 V5처럼 List<MyHandlerAdapters> handlerAdapters를 사용하여 V3, V4 두 버전을 지원하기 위한 과정도 없었기 때문에 ModelAndView 참조타입으로 변환해주는 핸들러어댑터가 필요없다고 생각했습니다. 그럼에도 불구하고 영한님께서 왜 핸들러어댑터 그림을 포함시켜서 스프링 MVC 구조가 만들어졌다고 말씀하셨는지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
7강. 유저 생성 API 개발 질문있습니다.
안녕하세요현재 7강. 유저 생성 API 개발 의 9분 듣고있습니다.국비 프로젝트에서 dto에 직접 저장을 했던 경험이 있습니다.선생님께서는 dto에 패키지의 UserCreateRequest에 저장하지 않고 domain패키지에 User라는 객체를 따로 만들어서 저장하시더라구요.그렇게 하는 이유를 알려주실 수 있을까요?
-
해결됨토비의 스프링 부트 - 이해와 원리
spring 명령어 오류
spring 명령어를 쳐서 확인하려는데 오류가 발생했습니다. 이 버전의 Java Runtime은 최대 55.0까지의 클래스 파일 버전만 인식한다고 합니다. Java SE 11 = 55이란거 까진 알았는데 그 다음에 어떻게 해야 될까요? 고민과 검색 많이하다가 답이 안나와 여쭤봅니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
도메인 모델을 나눌 때 중간테이블
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]현재 다니고 있는 회사에서는 Pojo 모델과 Entity 모델을 나누어서 관리하고 있습니다. 이 때, M:N 테이블을 나누어 주는 중간 테이블은 POJO 모델을 만들지 않고 infrastructure 레이어에 위치시키고 도메인 레이어에는 노출시키지 않으려고 하고 있는데요, 이 때 해당 중간 테이블을 구분되는 두 도메인중 어느쪽에 위치시켜야할지 고민이 되어 질문을 남깁니다.보통 이러한 중간 테이블에 대응하는 Entity는 어느 패키지에 두는지 기준이 궁금합니다.추후 데이터베이스를 나누었을 때 이러한 중간 테이블을 어디에 위치 시켜야할지 아니면 서로 다른 데이터베이스에 중간테이블을 중복 저장 시켜야할지 궁금합니다.양 쪽 모두에서 간간히 조회에 활용 됩니다. 위 방법 자체에 문제가 있다고 느끼신다면 어떤 대안이 있을지 남겨주시면 감사하겠습니다. 감사합니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
사용자 목록 조회가 하얀 화면만 뜹니다
정확히는 정말잠깐 순간적으로 목록화면이 뜨는듯 하다가 바로 하얀화면으로 전환됩니다저는 8080포트가 사용중이어서 9090으로 포트를 설정했습니다.8080으로도 바꿔서 해봤지만 증상은 같았습니다8080과9090에 할당된 서버의 상태는 이렇습니다강의는 8강. 유저 조회 API 개발과 테스트까지 수강한 상태입니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
자바 기본적인 두수 바꾸기 메소드 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. public static void swap(int a, int b) {if (a > b) {int t= a; a = b; b = t; }}int x= 1000;int y= 100;swap(x,y);이렇게 코드작성하면x는 100나오고 y는 1000나와야정상아닌가요?? 왜 인텔리제이에서 돌리면 x값과 y값이 그대로일까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서블릿 필터 에러 처리, 컨트롤러 에러 처리
안녕하세요 영한님영한님의 새로운 도전 응원하며강의 항상 잘 듣고 있습니다.!! 예외 처리 관련해서 강의를 듣고 제가 이해한것이 맞는지 확인차 질문 드립니다.일단 예외는 2가지 상황에서 발생 가능하다고 생각했습니다.서블릿 컨테이너에서 발생한 예외스프링 컨테이너에서 발생한 예외 서블릿 컨테이너에서 발생한 예외서블릿 컨테이너는 스프링 컨테이너가 직접 관리할 수 없기 때문에 @ControllerAdvice와 @ExceptionHandler을 사용하여 예외 처리를 할 수 없습니다. 따라서 필터에서 발생한 예외는 필터에서 처리해야 합니다. 예외 처리 방법예외가 발생하는 필터의 상위 필터에서 예외가 발생하는 필터의 예외를 처리하도록 한다.흐름서블릿 <- 필터1(필터2, 3 예외처리) <- 필터2 <- 필터3(예외 발생) 스프링 컨테이너에서 발생한 예외스프링 컨테이너에서 발생한 예외를 서블릿 컨테이너까지 보낼필요는 없다. 스프링 컨테이너에서 예외를 처리하고 서블릿 컨테이너에는 정상 호출인 것처럼 하면 된다. 예외 처리 방법@ControllerAdvice와 @ExceptionHandler을 사용하여 예외 처리를 한다. 흐름필터 <- 디스패처 서블릿 <- 컨트롤러 <- 인터셉터 <- ExceptionResolver(서비스 레이어 예외 처리) <- 서비스 레이어(예외 발생) 추가로 궁금한것이 있습니다.제가 보기에는 인터셉터에서 예외를 처리할 수 있을것 같습니다.그런데 인터셉터에서 예외를 처리하지 않는 이유는단일 책임 원칙을 지키기 위해서이다.따라서 컨트롤러(핸들러) 내부에서 발생한 예외 처리는 ExceptionResolver에 위임한다.정도로 이해 하면 될까요? 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
서비스 계층에서 인터페이스와 Impl 구분에 대해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 다른 사람의 코드를 읽던 중에 궁금한 것이 생겨서 질문 남깁니다.제가 읽은 코드에는 ~~Service(인터페이스) 와 ~~ServiceImp로 작성을 했습니다. 이 전에도 이런 구조를 사용하는 코드를 종종 봤습니다. 저는 지금까지 그냥 바로 인터페이스 없이 ~~Service를 만들고 비즈니스 로직을 작성 했습니다.제가 찾아본 결과로는 인터페이스와 구현을 구분하는 이유는 2가지 였습니다.OCP 법칙을 더 잘 지키기 위해서추상과 구현을 OCP 법칙을 지키고 다형성을 확보하기 위해서AOP Proxy과거 스프링에서 AOP를 사용할 땐 JDK Dynamic Proxy를 사용하기 때문에 인터페이스가 필요했다. 하지만 지금은 GCLIB를 사용할 수 있기 때문에 사실상 의미를 잃었다.추가적으로 인터페이스를 나누고 인터페이스에 javadoc용 주석을 남겨두면 유지보수 측면에서 읽기에 더 나은 부분이 있지 않을까 정도 생각해 보았습니다.서비스 계층에서 인터페이스와 구현을 나누는 것과 하나의 서비스 클래스에 구현하는 것 중에 대부분의 경우 어떤 것을 더 권장하시는지 궁금합니다. 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
xml 관련 질문 드립니다.
[질문 내용]처음 스프링을 배울 때 spring legacy 프로젝트로 배웠습니다. 따라서 root-context.xml, servlet-context.xml 방식으로 배웠습니다. 이전에 질문 드렸을때, "SpringApplication.run() 메서드는 기본적으로 @SpringBootApplication이 위치한 패키지와 하위 패키지를 시작점으로 모든 클래스를 스캔합니다 따라서 @Configuration, @Component, @Service, @Repository 등의 애노테이션이 있는 클래스를 찾아서 스프링 애플리케이션의 컨텍스트를 생성하는데 사용합니다." 라고 답변을 받았습니다. 하지만 legacy 프로젝트를 실행할때에는 @SpringBootApplication을 따로 적지 않았는데, 어떻게 해당 xml(root, servlet)에서 bean을 읽어오는지 의문이 듭니다. 추가로 xml로 작성하였을때도 SpringApplication.run() 메서드가 자동으로 읽는지도 문의드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
/members/createMemberForm.html 파일에 대해서 질문이 있습니다.
안녕하세요.home 화면에서 회원가입을 누르면 Members/new 페이지로 넘어가는데 넘어가면서@GetMapping(/members/new) 함수가 호출되는 것으로 이해했습니다.이 함수가 호출이 되면 members/CreateMemberForm 페이지를 리턴하는데 왜 url 에는 계속 memebers/new 가 뜨는지 궁금합니다. members/CreateMemberForm 가 url 에 있어야할 것 같은데 왜 그대로 members/new 인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
낙관적락 테스트 코드 작성시 질문입니다.
안녕하세요. 항상 강의 잘 듣고 있습니다.낙관적 락에 대해서 직접 테스트 코드를 통해 동작 방식을 살펴보고자 하는데 생각대로 동작하지 않아서 질문남깁니다. 우선 테스트 코드 시 스프링 IOC 컨테이너를 사용하기 위해 @SpringBootTest를 선언한 상황이고, 아래는 테스트 코드 내용입니다.스레드 1(트랜잭션1)에서 낙관적 락을 사용한 조회를 하도록 했고 커밋 되기 전, 스레드 2(르랜잭션2)에서 해당 데이터를 변경하도록 했습니다. 예상 대로라면 예외가 발생해야되는 데 정상 종료가 되어서 질문드립니다. ㅠㅠ로그를 찍어보았는데, 예상대로 각 스레드 별로 독립적인 트랜잭션이 실행되고, 낙관적 락을 통해 마지막에 version 확인 쿼리까지 발행하는데 왜 오류가 발생하지 않는지 궁금합니다. 잘못된 점이 있으면 알려주시면 감사하겠습니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
./gradlew clean build 에러 발생
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]./gradlew clean build를 했을 때 아래와 같은 에러가 발생합니다.구글 드라이브 링크: https://drive.google.com/file/d/1noPIwH5K_JrQ_st4-VSuOOqVLuLBopJw/view?usp=sharing$ ./gradlew clean build FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring root project 'jpashop'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.1.0. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.1.0 > No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.1.0 was found. The consumer was configured to find a runtime of a library compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6.1' but: - Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.0 declares a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') - Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.0 declares a runtime of a component, and its dependencies declared externally: - Incompatible because this component declares documentation and the consumer needed a library - Other compatible attributes: - Doesn't say anything about its target Java version (required compatibility with Java 11) - Doesn't say anything about its elements (required them packaged as a jar) - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') - Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.1.0 declares a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') - Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.1.0 declares a runtime of a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') - Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.0 declares a runtime of a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') - Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.0 declares a runtime of a component, and its dependencies declared externally: - Incompatible because this component declares documentation and the consumer needed a library - Other compatible attributes: - Doesn't say anything about its target Java version (required compatibility with Java 11) - Doesn't say anything about its elements (required them packaged as a jar) - Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 4s
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
osiv OFF했을 때 ordersV1 실행시 질문 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용] @GetMapping("/api/v1/orders") public List<Order> ordersV1() { List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List<OrderItem> orderItems = order.getOrderItems(); orderItems.stream().forEach(o -> o.getItem().getName()); } return all; }OSIV를 껏을 경우에 order.getMember().getName()에서 에러가 뜨는게 맞다고하셨습니다. 그런데 ordersv1 사용시에 findAllByString을 사용하면서 트랜잭션을 애초에 사용하지 않았는데 어느 타이밍에 트랜잭션이 켜지고 꺼지면서 커넥션이 사라지는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
home.html
스프링 실행이 안되서 보니까h2연동을 안해서 그렇던데, 항상 h2를 연결해야지 스프링이 등록이 되는 이유가 무엇인가요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
저처럼 맥 애플실리콘사용하시면서 mysql error2002 뜨시면
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)이거 뜨시면https://jaynamm.tistory.com/entry/Mac-ERROR-2002-HY000-Cant-connect-to-local-MySQL-server-through-socket-tmpmysqlsock-2 여기 참고해보세용~
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
orderList.html 에서 <script> 부분을 IntelliJ에서 인식을 못합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]orderList.html 에서 <script> 부분을 IntelliJ에서 인식하지 못합니다. 그래서 이 부분이 실행되지 않는 것 같습니다.인쇄한 내용이나 강의 화면에는 색이 구별되어 보이는데, 어떤 부분이 잘못되었는지 찾을 수가 없습니다.도움 부탁드리겠습니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산 락 질문드립니다.
안녕하세요 강의 잘 들었습니다!완강하고 나서 몇 가지 궁금증이 생겨 질문드립니다.분산 락을 "분산" 락이라고 부르는 이유가 뭔가요?Redis가 인메모리 DB이다보니 서버마다 Redis를 가지고 있어 여러 서버에서 모두 가지고 있어 분산 락이라고 부르는 걸까요?Redis가 여러 서버에 분산되어 있다보니 서로 싱크를 맞추기가 쉽지 않을 것 같은데 이런 부분은 어떻게 해결할 수 있나요?서로 싱크가 맞지 않는다면 synchronized 키워드의 문제점처럼 여러 프로세스에서 접근할 수 있어 정합성이 보장되지 않을 것 같아서요!Redis는 인메모리 DB라 휘발성인데 서버가 다운될 경우 복구는 어떤식으로 이뤄지는지 궁금합니다!