inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

orderList.html 에러가 발생합니다

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] https://drive.google.com/drive/folders/15jLgIsX62wpySXl_Zw3PWlFiqCv-EMVx?usp=sharing 웬만한 에러는 혼자 해결하려했지만 이번만큼은 해결을 못 하겠습니다.. 디렉토리 위치도 맞고 Test도 잘했고 디버깅해봐도 데이터는 잘 넘어오는데.. 뭐가 문젠지 모르겠습니다

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
ej 댓글 2 좋아요 0 조회수 782

@Component

해결됨

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

안녕하세요 또 이렇게 질문을 드리네요 공통 개발 - 인터셉터에서 AdminInterceptor은 @Component을 사용합니다. 제가 자료를 찾아봤는데 개념 이해가 어렵더라구요 개발자가 직접 작성한 class를 Bean으로 등록하기 위한 어노테이션이라고 정의 되어 있던데 그럼 Bean은 또 뭔지 찾아봤어요 자바 객체를 스프링에서는 Bean이라고 한다. 라고 정의 되었더라구요. 객체는 뭐 재료를 합쳐서 사용자가 사용할 수 있겠끔 만들어진 거가 객체인건 알고 있고 .... 다시 정리하면 직접 작성한 class를 객체화 시키려는건가라고 좀 애매하게 이해했는데 이건 또 아닌거 같고.. 예제를 본다면 class InlineExamConsole { @Autowired public void setExam(Exam exam) { this.exam = exam; } } 이 클레스면 xml은 <context:annotation-config/> <bean id = "exam" class="entity.NewlecExam" /> <bean id = "console" class="ui.InlineExamConsole"> </bean> 로 되어야 하고... IoC 컨테이너의 상황은 exam: Exam<---- console:InlineExamCode 처럼 플로우가 될꺼구... 그런데 <context:annotation-config/> <bean id = "exam" class="entity.NewlecExam" /> <!-- <bean id = "console" class="ui.InlineExamConsole"> </bean>-> 를 해서 삭제.... bean을 삭제 하면 IoC 컨테이너의 상황은 아래처럼 될듯 한데 exam: Exam<---- console:InlineExamCode console는 또 사용해야겠으니 아래처럼 @Componet를 등장시키고, @Componet class InlineExamConsole { @Autowired public void setExam(Exam exam) { this.exam = exam; } } IoC 컨테이너에서 console:InlineExamCode를 부활 exam: Exam<---- console:InlineExamCode 그런데 부활만 했지 그냥 좀비 상태가 되어 버린 console:InlineExamCode... console:InlineExamCode은 어떻게 찾는건지.. 그럼 xml를 변경 <context:component-scan base-package = "spring.di.ui"/> <context:annotation-config/> <bean id = "exam" class="entity.NewlecExam" /> 위 테그로 spring.di.ui에 컴포넌트가 있으니 다른곳에 찾지 말고 위 테그에서 컴포넌트 찾고 그 컴포넌트를 Bean에 등록해서 객채화 해~~~ 라는거같은데 코드상으로는 이렇게 이해를 했어요 하지만 강의에서는 context:component-scan base-package 를 못본거 같은데 ....(뭐 제가 바빠서 꼼꼼하게 못본것일 수도 있고 ) 저 컴포넌트의 이해를 좀 도와주시면 안될까요?? 컴포넌트 활용이나 @Component를 사용안하면 얼마나 불편해지길래 저 이노테이션을 사용한건지 ... (사실 저 이노테이션을 안써도 잘 활용할 수 있을거 같은데 ...)

  • kotlin
  • mysql
  • docker
  • spring-boot
  • jpa
just kim 댓글 1 좋아요 1 조회수 213

spring Security 구현중 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 에러 발생

미해결

https://github.com/myungkeun02/spring_blog_3 공부하고있는 코드입니다. 제목 그대로 포스트맨으로 테스트중에 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 라는 에러가 발생합니다. 구글링해서 문제가 발생할만한 부분을 모두 찾아 보았지만 해결이 안되어 글 올려봅니다. 해결해주시는분께 아메리카노 쏩니다

  • spring
  • error
  • security
  • servlet
  • execption
  • java
명근 최 댓글 1 좋아요 0 조회수 554

로그인 성공 후 어떻게 진행되는지 이해가 안갑니다.

미해결

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

@Override protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, Authentication auth) throws IOException, ServletException { String userName = ((User) auth.getPrincipal()).getUsername(); UserDto userDetails = userService.getUserDetailsByEmail(userName); byte[] secretKeyBytes = Base64.getEncoder().encode(environment.getProperty("token.secret").getBytes()); SecretKey secretKey = Keys.hmacShaKeyFor(secretKeyBytes); Instant now = Instant.now(); String token = Jwts.builder() .subject(userDetails.getUserId()) .expiration(Date.from(now.plusMillis(Long.parseLong(environment.getProperty("token.expiration_time"))))) .issuedAt(Date.from(now)) .signWith(secretKey) .compact(); res.addHeader("token", token); res.addHeader("userId", userDetails.getUserId()); } 여기서 로그인 성공 후 토큰이 발급된 뒤에 @Component @Slf4j public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> { Environment env; public AuthorizationHeaderFilter(Environment env) { super(Config.class); this.env = env; } public static class Config { // Put configuration properties here } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { return onError(exchange, "No authorization header", HttpStatus.UNAUTHORIZED); } HttpHeaders headers = request.getHeaders(); Set<String> keys = headers.keySet(); log.info(">>>"); keys.stream().forEach(v -> { log.info(v + "=" + request.getHeaders().get(v)); }); log.info("<<<"); String authorizationHeader = request.getHeaders().get(HttpHeaders.AUTHORIZATION).get(0); String jwt = authorizationHeader.replace("Bearer", ""); // Create a cookie object // ServerHttpResponse response = exchange.getResponse(); // ResponseCookie c1 = ResponseCookie.from("my_token", "test1234").maxAge(60 60 24).build(); // response.addCookie(c1); if (!isJwtValid(jwt)) { return onError(exchange, "JWT token is not valid", HttpStatus.UNAUTHORIZED); } return chain.filter(exchange); }; } private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(httpStatus); log.error(err); byte[] bytes = "The requested token is invalid.".getBytes(StandardCharsets.UTF_8); DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes); return response.writeWith(Flux.just(buffer)); // return response.setComplete(); } private boolean isJwtValid(String jwt) { byte[] secretKeyBytes = Base64.getEncoder().encode(env.getProperty("token.secret").getBytes()); SecretKey signingKey = new SecretKeySpec(secretKeyBytes, SignatureAlgorithm.HS512.getJcaName()); boolean returnValue = true; String subject = null; try { JwtParser jwtParser = Jwts.parserBuilder() .setSigningKey(signingKey) .build(); subject = jwtParser.parseClaimsJws(jwt).getBody().getSubject(); } catch (Exception ex) { returnValue = false; } if (subject == null || subject.isEmpty()) { returnValue = false; } return returnValue; } 여기로 넘어 오는 게 맞나요? 그리고 그 뒤에 어떻게 진행되는지 설명 부탁드립니다!!

  • spring-boot
  • jpa
  • 아키텍처
  • spring-cloud
  • kafka
  • msa
  • rabbitmq
댓글 2 좋아요 0 조회수 627

protected 사용 이유

해결됨

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

안녕하세요! 해당 강의에서 기본 생성자를 추가해주실 때, public이 아니라 protected를 사용하셨는데, 그 이유가 무엇인가요? 혹시라도 다른 곳에서 기본생성자를 사용하지 못하도록 하게 하기 위함인가요? 제가 자바가 안익숙해서 그런지, 이러한 접근 제어자를 쓰는 것이나, static, final 키워드를 언제 쓰거나 안써야 하는지에 대한 감이 별로 없어서 구분을 잘 못하는데, 이러한 실력은 어떤 경험을 더 쌓아야 할지.. 아니면 어떤 키워드를 어떻게 공부해야 더이상 안 헷갈리고 확실하게 알 수 있을지 궁금합니다...! 항상 친절한 강의 감사드립니다.

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
iwbm312 댓글 2 좋아요 2 조회수 823

사실상 final 변수에 관하여 (값의 변경에 관한 질문입니다)

해결됨

김영한의 실전 자바 - 중급 1편

========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 강의를 보던 중 궁금한 점이 생겼습니다. 사실상 final 변수는 (final 키워드를 넣은 것 처럼) 한 번 값이 설정되면 그 후에 값을 변경하지 못합니다. => 질문에 대한 핵심은 다음과 같습니다. 그렇다면 인스턴스를 생성하기 전에 지역 변수의 값을 변경하는 건 괜찮지 않을까? 근데 왜 안될까? => 그렇게 생각한 이유는 다음과 같습니다. 지역 변수를 캡쳐하는 시점은 (강의 속 LocalPrinter) 지역 클래스의 인스턴스 생성을 시도 한 후 입니다. (제 생각에,,) 코드는 위에서 아래로 읽기 때문에 Printer printer = new LocalPrinter(); 가 적혀져 있기 전에는 지역 변수의 값을 변경해도 되지 않을까? 하는 이유입니다.

  • java
  • 객체지향
30po_bil 댓글 1 좋아요 0 조회수 526

JPAQueryFactory 에러

미해결

실전! Querydsl

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 김영한님 강의대로 spring 3.x.x버전으로 제대로 실행을 했는데 사진처럼 에러가 발생하네요... 인텔리제이에서 file->invalidate cache-> invalidate and restart했는데도 안되네요. 제 jdk는 17입니다. 추가로 저는 Q클래스가 build/calssess안에서 생성이되고 강의와 달리 generated에는 Q클래스가 아닌 QHello.java 로 생성이됩니다. plugins { id 'java' id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.4' } group = 'midas' 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-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'io.jsonwebtoken:jjwt-api:0.12.5' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' implementation 'org.jetbrains:annotations:24.0.0' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.5' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') }

  • java
  • jpa
ehddbs452100 댓글 1 좋아요 0 조회수 392

JpaRepository의 메서드 대신 ItemService의 메서드를 사용하는 이유가 궁금합니다

해결됨

스프링 DB 2편 - 데이터 접근 활용 기술

안녕하세요 섹션 8(데이터 접근 기술) 실용적인 구조 강의에서 ItemSercvice 클래스에서 update 메서드를 작성할 때 itemRepositoryV2.findById(itemId)처럼 JpaRepository 메서드를 사용하지 않고 바로 밑의 findById 메서드를 사용해서 findItem을 가져오는 이유가 궁금합니다 제 생각에는 둘 다 Optional로 반환되어서 결과값은 똑같을것 같은데 다른 이유가 있는건지 아니면 단순 가독성 때문인지 궁금해서 질문드립니다

  • spring
  • mvc
  • jpa
  • querydsl
  • spring-data-mybatis
  • spring-jpa
로봇병정 댓글 1 좋아요 0 조회수 218

쿼리 테이블 별칭

미해결

스프링 DB 2편 - 데이터 접근 활용 기술

선생님꼐서 쓰는 쿼리를 보면 select m from Member m 이런식으로 m별칭주시는데 m.*이런식이나 테이블이 하나라면 별칭 없이 가는것과 무슨 차이가 있을까요?? 그냥 단순히 개발자 스타일일까요??

  • spring
  • mvc
  • jpa
  • querydsl
  • spring-data-mybatis
  • spring-jpa
junhyoeung kim 댓글 1 좋아요 0 조회수 214

java scanner 오류

미해결

txt파일에는 아래와 같이 저장되어 있습니다. 점수가 가장 높은 학생의 이름을 출력해야하고 점수가 동일할 경우 모두 출력하는 프로그램입니다. 김일번 64 김이번 83 김삼번 26 김사번 36 김오번 78 김육번 54 김칠번 60 김팔번 85 김구번 45 김십번 85 프로그램을 실행했을 때 Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor ( Scanner.java:94 7 ) at java.base /java.util.Scanner.nex t ( Scanner.java:160 2 ) at java.base/java.util.Scanner.nextInt ( Scanner.java:226 7 ) at java.base/java.util.Scanner.nextInt ( Scanner.java:222 1 ) 이렇게 오류가 발생합니다. 해결방법 아시는 분 가르쳐주세요!!ㅜㅜ package kh; import java.io.*; import java.util.Scanner; class Student { //int id; String name; int grade; Student(String name, int grade) { //this.id=id; this.name=name; this.grade=grade; } } class StudentTable{ Student[] st; StudentTable(int size) { st=new Student[size]; } void maxStudent() { int maxGrade=0; for(Student student : st) { if(student.grade > maxGrade) { maxGrade = student.grade; } } System.out.println("최고 점수를 가진 학생:"); for(Student student : st) { if(student.grade == maxGrade) { System.out.println(" " + student.name + " " + student.grade); } } } } public class homework05{ public static void main(String[] args) { StudentTable stable; try { FileInputStream fin=new FileInputStream("C:\\Users\\user\\Desktop\\student_score.txt"); Scanner scanner = new Scanner(fin); int size=scanner.nextInt(); stable=new StudentTable(size); for(int i=0; i<stable.st.length; i++) { //int id=scanner.nextInt(); String name=scanner.next(); int grade=scanner.nextInt(); stable.st[i]=new Student(name,grade); System.out.println(" "+name+" "+grade); } scanner.close(); stable.maxStudent(); } catch(FileNotFoundException e) { System.out.println("file not exist"); } } }

  • java
dkfma0799 댓글 1 좋아요 0 조회수 276

왜 요청에다가 AthenticFilter를 적용할까요?

미해결

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

apigateway의 application.yml을 보면 get요청에는 authorizationHeaderFilter를 적용시키고 있습니다. authenticFilter는 그저 로그인 요청시 attempthAuthentication메소드와 successfulAthentication메소드를 통해 인증을 처리하고 response헤더에 토큰을 추가하는 역할입니다. 따라서 로그인 요청에만 적용하면 될 것 같은데, 깃허브의 최신코드 버전을 보면 거의 모든 요청에 authenticationFilter를 적용하고 있습니다. 왜 로그인요청이 아닌 다른 요청에다가 AthenticFilter를 적용할까요? apiGateway-service에서 GET요청만 AuthoriztionFilter를 적용하면 되지않나요?? http.authorizeHttpRequests((authz) -> authz .requestMatchers(new AntPathRequestMatcher("/actuator/**")).permitAll() .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll() .requestMatchers(new AntPathRequestMatcher("/users", "POST")).permitAll() .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll() // .requestMatchers(new AntPathRequestMatcher("/welcome/**")).permitAll() // .requestMatchers("/**").access(this::hasIpAddress) .requestMatchers("/**").access( new WebExpressionAuthorizationManager("hasIpAddress('127.0.0.1') or hasIpAddress('172.30.1.48')")) .anyRequest().authenticated() )

  • spring-boot
  • jpa
  • 아키텍처
  • spring-cloud
  • kafka
  • msa
  • rabbitmq
고은우 댓글 1 좋아요 0 조회수 309

로그인까지는 되는데 /welcome에서 403 Forbidden 에러가 뜹니다.

미해결

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

안녕하세요. 깃허브에서 spring boot 3.2 브랜치통해 코드를 작성했습니다. 그런데 회원가입, 로그인까지 해서 jwt토큰까지는 잘 받아오는데, 그 이후에 /welcome으로 헤더에 토큰으로 추가해서 요청을 보내도 403 forbidden에러가 뜹니다. 코드는 spring boot 3.2 브랜치와 동일합니다.

  • spring-boot
  • jpa
  • 아키텍처
  • spring-cloud
  • kafka
  • msa
  • rabbitmq
고은우 댓글 2 좋아요 0 조회수 1088

현재 1강 테스트중 오류내용입니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

MemberRepositoryTest를 작성하고 실행하면 자꾸 이 오류가 뜨는데 이유를 모르겠습니다..

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
임다정 댓글 2 좋아요 0 조회수 212

Q클래스 안보여요

미해결

실전! Querydsl

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] plugins { id 'java' id 'org.springframework.boot' version '3.2.4' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' 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' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' testImplementation 'org.projectlombok:lombok:1.18.26' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } clean 이후 build를 누르니 사진처럼 main패키지까지만 나오네요

  • java
  • jpa
댓글 1 좋아요 0 조회수 706

mysql 실행 질문

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

국비 수료 후 선생님 강의 듣고 있습니다. 저는 오라클을 db로 사용했었고 그 땐 sql디벨로퍼를 주로 사용했었는데요 전 인텔리제이 무료버전이라 mysql command line client를 사용해야 할텐데 제가 궁금한건 오라클에서 sql디벨로퍼를 사용했더라면 그에 대응되는게 인텔리제이의 mysql command line client라 보면 될까요? sql디벨로퍼에선 테이블도 가시적으로 보이고 셀렉트 해서 조회하는 결과도 보였는데 mysql command line client 같은 경우 리눅스형식같고 뭔가 좀 어색해서용

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
seohyeonjin787 댓글 2 좋아요 0 조회수 280

문득 ArrayList 에 대해 궁금해졌습니다.

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 내용] 안녕하세요! ArrayList 에 대해 이것저것 찾아보던 중 이런 내용이 있었습니다. ArrayList,Map 은 동시성 이슈가 있어 ArrayList 대신 CopyOnWriteArrayList를 Map 대신 ConCurrentHashMap 을 쓰라는 내용이었습니다. 이에 대해 실제 스프링으로 개발할 때 위 내용이 어떻게 응용되는지 이해가 안되고 찾지 못해서 질문드립니다. 뭐 단순히 ArrayList 에 정수 넣고 실험해서 동시성 이슈가 있다라고 파악을 한다고 치더라도 뭐 어느 경우에 적용해야 하는지 이해가 안갑니다. 질문 요약 1) ArrayList 대신 CopyOnWriteArrayList 를 써야 하는 실무적인 실제 예를 들어주세요! 지금까지 영한님한테 배웠던 대로 양방향 관계에서 List = new ArrayList<>로 초기화 해줬는데 그러면 이는 유저가 많은 멀티스레드 환경에서 위험한 것 아닌가요?? public PostResponseDto showDetailsPost(final Long postId){ //Post + PostImage + Post 게시글 작성자 함께 영속화 Post post = findPostWithFetchMemberAndImage(postId); //첫 댓글 Reply (대댓글 X) + 부모댓글 작성자 함께 영속화 List<Reply> parentReply = replyRepository.findParentReplyByPostIdWithFetchMember(postId); List<ReplyResponseDto> replyResponseDtoList = new ArrayList<>(); //부모-> 자식 순으로 DTO 순서 저장. for(Reply parent: parentReply){ replyResponseDtoList.add(ReplyResponseDto.of(parent,makeNickNameForReply(parent),makeContentsForReply(parent))); 위 코드는 List<ReplyResponseDto> 를 new ArrayList<>() 로 초기화 해서 add 로 넣어주는 부분이 있습니다. 이런 부분도 다 CopyOnWriteArrayList를 써야 하는 것인가요? 2) Map 도 마찬가지입니다. 실제 Map 대신 ConcurrentHashMap 을 써야 했던 실무적인 예를 들어주시면 감사하겠습니다.

  • java
  • spring
  • spring-boot
  • jpa
dionisos198 댓글 1 좋아요 0 조회수 334

학습방향 질문드립니다

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 mvc강의를 2편까지 모두 듣고 야생형코스를 따라가려고 jpa1 편을 수강중입니다. 현재 섹션2까지 들었는데 도메인 분석과 엔티티설계시 강사님께서 설명해주신 다대다관계, 연관관계 메서드 등 확실히 이해는 안가지만 이런게 있구나 하며 넘어가도 되는걸까요? 이 강의에서는 jpa를 알아가보는 것보다 스프링에서 jpa를 어떻게 쓰는지만 알고 이 강의 듣고 기본편으로 넘어가도 되는걸까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
포닥 댓글 1 좋아요 0 조회수 198

알고 있던 내용과 달라서 조금 혼동됩니다.

해결됨

김영한의 실전 자바 - 기본편

안녕하세요 영한님. 자바를 복습하고 있는 학생입니다. 이번 파트 정말 이해가 잘 되게 설명해주셔서 내용을 이해하는데는 어려움이 없었는데 기존에 알고 있던 지식때문인지 혼동되는 부분이 있어 질문드립니다. 기존에 알고 있는 지식은 자식 인스턴스 생성시 '부모의 필드 값과 가상 메서드 테이블 등의 메타 정보를 포함하는 하나의 인스턴스 생성' 이었습니다. 그런데 이번 강의 내용에선 '외부에서 볼때는 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식 모두 생성되고 공간도 구분' 이라고 하셨습니다. 그렇다면 이 문장을 ' 부모부터 자식 클래스까지의 모든 인스턴스를 생성 ' 이라고 봐야하나요? 아니면 '부모부터 자식까지의 모든 메타 정보를 포함하는 하나의 인스턴스 를 생성' 이라고 봐야하나요? 뒤에서 배울 super()를 통해 자식 인스턴스 생성시 부모 생성자를 필수로 호출하므로 '모든 인스턴스'를 생성하는 것도 말이 될 거 같지만 만약 모든 인스턴스를 메모리에 생성한다면 메모리가 비효율적으로 사용되는 것도 같아 이 부분이 좀 헷갈립니다.

  • java
  • 객체지향
TH Kwon 댓글 1 좋아요 0 조회수 453

낙관적 락에 대해 질문이 있습니다.

미해결

실전! 스프링 데이터 JPA

Hibernate는 @Version 을 사용하고, Lock 옵션을 @Lock(LockModeType.OPTIMISTIC) 을 사용할 경우에 NONE 모드와 다르게 엔티티를 수정하지 않고 단순히 조회만 해도 버전을 확인한다고 강사님 JPA 책에 작성되어있습니다. 실제 코드로 구현해보니 버전만 확인하는거 같더라구요 그 사이에 다른 트랜잭션이 해당 엔티티를 수정하여 버전이 변경되어도 ObjectOptimisticLockingFailureException 예외가 발생하지 않습니다. 간단하게 로직을 설명드리면 트랜잭션 A가 옵티미스틱 락 모드로 회원을 조회합니다. version = 0 트랜잭션 A를 5초 대기합니다. 트랜잭션 B가 회원을 수정하여 버전이 변경됩니다. version = 1 트랜잭션 B가 종료됩니다. 5초가 지나 트랜잭션 A가 종료됩니다. 트랜잭션 A가 종료될 때 옵티미스틱 락 모드라서 마지막에 버전을 확인합니다. select version as version_ from member where id=? 그런데 트랜잭션 A가 종료될때에 회원 버전이 다르지만 예외가 발생하지 않습니다. 이러면 OPTIMISTIC의 용도가 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다. 만약 같지 않으면 예외가 발생한다고 작성되어있는데 예외가 발생하지 않는다면 강사님께서 설명해주신 조회한 엔티티는 트랜잭션이 끝날 때까지 다른 트랜잭션에 의해 변경되지 않아야한다. 조회 시점부터 트랜잭션이 끝날때까지 조회한 엔티티가 변경되지 않음을 보장한다. 이 말의 다른 의미가 어떤건지 궁금합니다 ! 아니면 제가 테스트를 잘못하고 있는 걸까요..? 아래는 로직에 대한 간단한 코드입니다. 도메인 package org.example.stock_rt_1.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; private long personId; private int age; @Version private Long version; public Member(long personId, int age) { this.personId = personId; this.age = age; } public void addAge() { ++this.age; } } 리포지토리 package org.example.stock_rt_1.repository; import jakarta.persistence.LockModeType; import org.example.stock_rt_1.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import java.util.Optional; public interface MemberRepository extends JpaRepository<Member, Long> { @Lock(LockModeType.OPTIMISTIC) Optional<Member> findByPersonId(Long id); } 서비스 package org.example.stock_rt_1.service; import lombok.RequiredArgsConstructor; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @Service @RequiredArgsConstructor public class MemberService { public final MemberRepository memberRepository; @Transactional public void addAge(long personId) { sleep(500); //findMember가 먼저 실행되야하기 때문에 넣었습니다. Member member = memberRepository.findByPersonId(personId).orElseThrow(); member.addAge(); } @Transactional public void findMember(long personId) { memberRepository.findByPersonId(personId); sleep(5000); } private void sleep(long mills) { try { Thread.sleep(mills); } catch (InterruptedException e) { System.out.println("e = " + e.getMessage()); } } } 테스트코드 package org.example.stock_rt_1.service; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class MemberServiceTest { @Autowired private MemberService memberService; @Autowired private MemberRepository memberRepository; @Test @DisplayName("회원 정보를 조회중 다른 트랜잭션에서 정보를 변경했다.") void addAge() throws InterruptedException { // given int personId = 5555; memberRepository.save(new Member(personId,15)); // when Thread selectThread = new Thread(() -> memberService.findMember(personId),"트랜잭션-A"); selectThread.start(); Thread updateThread = new Thread(() -> memberService.addAge(personId),"트랜잭션-B"); updateThread.start(); selectThread.join(); updateThread.join(); } } 로그 [트랜잭션-A] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : update member set age=?,person_id=?,version=? where id=? and version=? [트랜잭션-B] : select version as version_ from member where id=? [트랜잭션-A] : select version as version_ from member where id=?

  • java
  • spring
  • spring-boot
  • jpa
티벳로보 댓글 2 좋아요 0 조회수 328

PageRequest, pageable

미해결

실전! 스프링 데이터 JPA

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 이전 강의에서는 PageRequest.of(pagenum, pagesize, sort.by ()) 를 사용해서 직접 설정해줘서 리포지토리 매서드에 인자로 넘겼는데 mvc의 @PageableDefault를 사용하면 이런 부분을 자동으로 처리해준다라고 이해해도 괜찮을까요?

  • java
  • spring
  • spring-boot
  • jpa
sde101573 댓글 1 좋아요 0 조회수 635

인기 태그

인프런 TOP Writers

주간 인기글