묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Hello.html
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이 코드로 했을때 hello.html이 안되길래질문글들을 찾아봤는데 이 코드로 해보라는 말이 있어 해봤더니 돼었습니다왜 강의에 있던 코드로는 진행이 안되었던건가요?또 이와관련해서 앞으로의 강의에서도 유의해야할 점이 있나요?
-
해결됨스프링 시큐리티
안녕하세요 강사님.
안녕하세요 강사님강의 내용을 듣고 제가 이해한 부분이 맞는지 여부와추가적으로 질문드리고 싶은 내용이 있습니다. 유저가 최초 로그인을(인증) 하게 되면SecurityContextPersistenceFilter에 HttpSessionSecurityContextRepository를 통해 SecurityContext를 생성하고UsernamePasswordAuthenticaionFilter에서 인증 처리를 거친 후에SecurityContextPersistenceFilter에서 Session에 저장하여 SecurityContext를 저장한다. 인증 이후에 유저가 요청하게 되면SecurityContextPersistenceFilter에 HttpSessionSecurityContextRepository를 통해 Session에서 SecurityContext를 가져와서SecurityContextHolder에 저장한다. 우선 제가 이해한 부분은 이렇습니다.맞게 이해했는지 궁금합니다. 그리고 여기서 추가로 여쭤보고 싶은 점이1. SecurityContextPersistenceFilter에 설명 강의 부분에서최종 응답 시 공통 로직으로 SecurityContextHolder에서 clearContext()를 한다고 설명해주셨는데SecurityContextHolder를 clear하지 않고 유지해야 Authentication객체를 계속 유지하는 게 아닌지 궁금합니다.또한 로그인한 유저 객체를 가져올 때SecurityContextHolder.getContext().getAuthentication()을 통해서 가져오는데최종 응답 시에 clearContext()를 한다면 어떻게 가져오는지 궁금합니다. 2. ajax 방식을 연습할 겸 따로 프로젝트를 만들어서 진행해봤습니다.거기서 FormLogin방식 자체를 사용하지 않았더니 filterChainProxy에 UsernamePasswordAuthenticationFilter 자체가 등록되지 않는 것 같습니다.UsernamePasswordAuthenticationFilter는 FormLogin 방식에서만 등록되는 필터인가요?그리고 인증 이후 SecurityContextPersistenceFilter에서 SecurityContextHolder에 값을 저장하는 로직이 궁금합니다.자체 필터를 등록하고 해당 필터에서 HttpSession에 SecurityContext key("SPRING_SECURITY_CONTEXT")로 authentication을 저장해도SecurityContextPersistenceFilter에서 SecurityContextHolder에 SecurityContext를 설정하지 않는 것 같습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
정적 컨텐츠 서빙 흐름 질문드립니다
안녕하세요, 정적 컨텐츠 서빙 흐름에 관해 질문드립니다.교재의 위 이미지 및 강의 내용에 따르면,localhost:8080/hello-static.html 로 접속 시, 먼저 hello-static 관련 컨트롤러를 우선적으로 찾아보고, 없을 경우 static/hello-static.html 을 찾아보는 순서로 설명을 해주셨습니다.정말 그런가 하여 hello-static에 매핑되는 컨트롤러를 다음과 같이 추가(+resources/templates/hello-static-template.html 추가)해보았는데, 여전히 정적 컨텐츠인 src/main/resources/static/hello-static.html 이 서빙됩니다.package hello.hellospring; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("/hello-static") String helloStatic() { return "hello-static-template"; } }따라서, 흐름도 이미지에 있는 것처럼 확장자(.html)까지 아예 명시하면, 컨트롤러를 거치지 않는 것이 아닌가 생각되는데, 제가 잘못 구현한 부분이 있거나 이해를 잘못 한 부분이 있을까요?감사합니다.관련 강의 및 교재강의 : '섹션 2. 스프링 웹 개발 기초' - 정적 컨텐츠교재 : 14p 정적 컨텐츠 서빙 흐름도 이미지
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
순수 jdbc 회원 목록 IllegalStateException 라이브러리 에러
ERROR 7708 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection] with root cause JdbcMemberRepository 클래스에서 pdf파일을 복붙한 후 전체 Run 누르고 localhost에서 회원 목록을 조회했더니 웹에서 실행이 안됩니다.라이브러리가 안 맞아서 에러가 난 것 같은데 구글링에서 찾아봐도 없어서 질문 올립니다.라이브러리만 따로 수정할 수 있나요?아니면 저 클래스만 다시 작성해야 될까요?앞으로도 스프링부트 쓰다 보면 에러가 계속 날 수도 있는데 spring 홈페이지에서 관련 문서를 찾아보면 될까요?어떻게 하면 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
결국 완강을 했습니다!
수강 신청은 몇 달 전에 했는데계속 듣다가 이해가 안가서 좀 쉬다가또 흐름이 끊기고 기억이 사라져 처음부터 다시듣기를 반복하다가 드디어 오늘 거진 3개월 만에완강을 했습니다!최소한의 이해로 따라온 강의지만 꽤 스프링에 대한이해도가 깊어진 것 같습니다ORM인 JPA를 배운 것이 특히 신기하게 집중되고흥미로웠습니다. 복잡한 sql코드를 없앨 수 있어서 그랬던것 같습니다, ㅎㅎ. 모든 로드맵을 구매하였으니 선생님만 믿고 스프링 강의를 무한 반복하여 많은 것을 얻어 가겠습니다!! 감사합니다.
-
해결됨실전! Querydsl
nullSafeBuilder메서드를 통해 null처리의 한계
개인 프로젝트를 진행하던중 where절의 조건들을 체이닝하는 과정에서 아래코드를 보면 경우 제일 앞에있는 nameLike()메서드가 null일 경우 에러가 발생하였습니다. and 조건일 경우 , 로 체이닝하면 되었지만 or조건들은 무조건 or()을 통해 연결을 해주어야했습니다.query.selectFrom(member) .where(nameLike("infren").or(nameEq("김영한강사님"))) .fetch();BooleanBuilder를 통해 조건을 처리해도되지만인프런 게시판을 통해알게된 nullSafeBuilder메서드를 만들어서 null처리를 하는 방법을 알게되었습니다. 하지만 몇가지 한계점들을 발견하였습니다.eq문에 null이 들어갈 경우에는 정상적으로 작동하였으나like절, 또는 in절에는 상황에 따라서 null을 넣을 경우 like,in문 자체가 파라미터로 null을 받지 못함으로 인해서 eq와는 다르게 작동하는 것을 발견하였습니다.몇 가지 경우의 테스트를 진행해보았습니다.eq절에 null을 넣을경우like절에 null을 넣을 경우 -> NullPointerExceptionin절에 String타입의 null을 넣을 경우in절에 String[] 타입의 null을 넣을 경우in절에 List<> 타입의 null을 넣을 경우 -> NullPointerExceptionin절에 객체(Team) null을 넣을 경우@Test void eq에Null을넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.eq(name))) .fetch(); assertEquals(findMember.size(),4); } @Test() void like절에_Null을_넣을때(){ String name = null; assertThrows(NullPointerException.class, () -> { List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.like(name))) .fetch(); }); } @Test void in절에_String타입의_Null을_넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.in(name))) .fetch(); assertEquals(findMember.size(),4); } @Test void in절에_String배열타입의_Null을_넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.in(name))) .fetch(); assertEquals(findMember.size(),4); } @Test void in절에_List에_Null을_넣을때(){ List<Team> team = null; assertThrows(NullPointerException.class, () -> { List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.team.in(team))) .fetch(); }); } @Test void in절에_Team타입의_Null을_넣을때(){ Team team = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.team.in(team))) .fetch(); assertEquals(findMember.size(),4); } public static BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) { try { return new BooleanBuilder(f.get()); } catch (IllegalArgumentException e) { return new BooleanBuilder(); } }where절안에서 사용하는 함수(like, in...등등)에 따라 파라미터 자체에 null을 받지 못함으로인해 nullSafeBuilder를 통해 해결할 수 없는 경우도 있는것 같습니다.이러한 경우에는 강사님께서 알려주셨던 아래와 같은 방법으로 메서드를 통해 파라미터의 null처리를 해주고private BooleanExpression nameLike(String name){ return name != null ? member.username.like(name) : null; }체이닝할 때는 and조건이면 , 를 사용하고, or조건으로 체이닝을 해야할 경우에는 BooleanBuilder객체에 체이닝하는 방식으로 구현을 해야할 것 같습니다.아래는 프로젝트에 적용했던 동적쿼리문 입니다. 앞서 말했듯이 and조건은 ,로 연결하고 or조건들은 Booleanbuilder객체에 체이닝을 하였습니다.//페이징 처리를 하지않은 동적쿼리문 -> 테스트에서 사용 public List<Article> searchBooleanBuilder(ArticleSearchCond cond) { BooleanBuilder builder = new BooleanBuilder(); builder.or(contentLike(cond.getContent()))//글 내용 keyword검색 .or(nickNameLike(cond.getWriter()))//작성자(닉네임) keyword검색 .or(nameLike(cond.getWriter()))//작성자(이름) keyword검색 .or(tagArticleIn(cond.getArticlesByTagValue()))//태그 keyword검색 .or(restaurantNameLike(cond.getRestaurantName()));//음식점명 keyword검색 return query.selectFrom(article) .where( followMembersIn(cond.getFollowMembers()),//팔로우한 유저로 검색 sidoEq(cond.getSido()),//시도로 검색 sigoonEq(cond.getSigoon()),//시군으로 검색 dongEq(cond.getDong()),//동으로 검색 latitudeBetween(cond.getLatitude()),//위도로 검색 longitudeBetween(cond.getLongitude()),//경도로 검색 categoryEq(cond.getCategory()),//음식점 카테고리로 검색 likeArticleIn(cond.getLikeArticles()),//좋아요누른 게시판 검색 builder//keyword조건 검색 ) .orderBy(article.id.desc())//아이디가 높은 것(최신순)으로 내림차순 .limit(20) .fetch(); }아래는 nullSafeBuilder의 한계를 모른 상태로 구현하였던 에러가 발생하는 코드입니다. radioBtnSearchCond(and조건들), keywordSearchCond(or조건으로 연결)안에 nullsafeBuilder로 null처리한 메서드들이 있습니다. public List<Article> searchByNullSafer(ArticleSearchCond cond) { return query.selectFrom(article) .where( radioBtnSearchCond(cond)//라디로 버튼 검색 조건들 .and(keywordSearchCond(cond))//keyword로 검색 조건들 ) .orderBy(article.id.desc())//아이디가 높은 것(최신순)으로 내림차순 .fetch(); }혹시 nullSafeBuilder를 구현 좋은 방법이 있던가, 다른 좋은 방법을 아시는 분이 있으면 알려주시면 감사하겠습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
join 메소드는 리턴값이 있는데 왜 그냥 호출해도 오류가 안나나요?
안녕하세요! 제목처럼 join 메소드는 회원가입시키고 아이디를 리턴해주는데 왜 테스트케이스는 리턴값을 따로 안받아줘도 오류가 나지않나요?memberService.join(member);-> 따로 Long saveId = memberService.join(member);이렇게 안해줘도 오류가 안나서 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 select관련해서 질문드립니다!
EntityManager가 tx종료와 동시에 지워진다고 하셨는데,만약 dml쿼리없이 단순 select만 하게되어서EntityTransaction tx = em.getTransaction(); tx.begin();위의 코드없이 select만 여러번 실행하게될 경우 em가 생겼다 지워졌다 생겼다 지워졌다가 반복된다고 보면 될까요??위와같이 이해를 하여서, 위의 코드를 지우고 아래의 코드를 실행하면, 하나의 트랜잭션으로 묶지 않았기에 두번의 쿼리가 나갈것이라 예상했지만, 쿼리가 한번만 나가는것 같아서요Member member1 = em.find(Member.class, 101L); Member member2 = em.find(Member.class, 101L);
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto
위강의에 MemberDto에 만약 address필드까지 추가해야한다면 MemberDto 리스트를 만들때List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName(),m.getAddress())) .collect(Collectors.toList()); 위와 같이 해준다면 MemberDto에서의 address와 findMembers에서의 address가 같은 주소값을 참조하고 있어 상황에 따라 뜻하지 않는 에러가 발생할 수 있다고 생각하는데 MemberDto에서 address 객체를 아예 새로 만드는 것이 더 좋을까요?? 현업에서는 어떻게 사용하는지 궁금합니다!
-
해결됨실전! Querydsl
Intellij IEDA 빌드로 querydsl Qtype파일을 못찾겠네요
설정- 빌드,실행,배포- 빌드 도구- Gradle 에서'빌드 및 실행'을 Gradle(디폴트)로 설정하여, querydsl을컴파일하면왼쪽처럼 querydsl의 Qtype 파일의 소스 루트가 잘설정이되어서 문제가없는데 IntelliJ IDEA로 설정하면 오른쪽처럼, 소스 루트를 찾지못하고코드작성할때 QMemeber, QTeam의 루트또한 찾지못하고 오류를 해결하지못합니다 querydsl을 IntelliJ IDEA로 빌드하려면 어떻게해야할까요? bulid.gradle파일입니다plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-management' version '1.1.0' } group = 'study' version = '0.0.1-SNAPSHOT' 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-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' implementation 'org.springframework.boot:spring-boot-starter-validation' //Querydsl 추가 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" } tasks.named('test') { useJUnitPlatform() }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
5:27 이름에 SpringDataJpa만 있으면
빈에 자동으로 등록시켜준다는 건가요?스프링에서 이 인터페이스가 스프링데이터jpa인지 어떻게 알 수 있나요?어떤 방식으로 인식을 하는건가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
혼자 코드를 짜봤는데
안녕하세요. 강사님자료구조 공부하다가 방금 전 숫자만 추출하는 강의를 보고 이번 강의에서 응용해 보았는데 출력 값은 동일하나 채점 사이트에서는 오답이라고 나와서 어떤 부분에서 틀렸으며 어떻게 고쳐야 할까요?완전 코드를 잘못 구현했다면 제가 설명에서 어느 부분을 이해하지 못한 것일 까요? import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; public class Main { public int solution(String s) { String answer = ""; s = s.replaceAll("[^0-9]", ""); // 숫자만 추출 while (s.length() > 0 && s.charAt(0) == '0') { s = s.substring(1); } Deque<Character> deque = new LinkedList<>(); // Deque 선언 (제네릭 타입 명시) // 문자열 s의 각 자리를 Deque에 추가 for (int i = 0; i < s.length(); i++) { deque.offer(s.charAt(i)); } // Deque에서는 0 제거 이후 while (!deque.isEmpty()) { char c = deque.peek(); if (c != '0') { answer += c; } deque.poll(); } return Integer.parseInt(answer); } public static void main(String[] args) { Main T = new Main(); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); System.out.println(T.solution(str)); } }위 코드는 오류가 나고 아래 코드는 컴파일 에러가 납니다.import java.util.Scanner; public class Main { public int solution(String s) { String answer = ""; s = s.replaceAll("[^0-9]", ""); // 숫자만 추출 while (s.length() > 0 && s.charAt(0) == '0') { answer = s.substring(1); } return Integer.parseInt(answer); } public static void main(String[] args) { StringTest1_9 T = new StringTest1_9(); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); System.out.println(T.solution(str)); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
인텔리제이 에디터 관련 질문드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]함수를 연속으로 호출할 때 함수().함수().함수() 이런 형식으로 사용하곤 합니다. 인텔리제이에서 이런 문법을 쓰면 자동완성으로 탭이 연달아 일어나 보기가 껄끄럽습니다. 자동완성을 일자로 해주는 해결방법 있을까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.set get 오류 해결하려고 import 바꾸니 이렇게 오류가 생기네요..
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
예외 구문에 대해서..
try throw catch 구문에서 throw로 예외를 던지면 catch 구문에서 받아서예외에 대한 내용을 출력한다고 이해를 하고있는데뒷쪽 강의를 듣다보니 스레드 join,sleep, 파일 읽기 구문을 try catch 구문으로 감쌀때 RuntimeExeption 과 InterruptedEception 그리고 IOException 친구들은 다른 throw catch 구문과 다른 것 같아서 질문 드립니다..try { thread.join(2500); // 2.5초 대기 } catch (InterruptedException e) { throw new RuntimeException(e); } --------------------------------------------------------------------------- try(BufferedReader br = new BufferedReader(new FileReader("goodjob.txt"))) { String line; while((line = br.readLine()) != null ) { System.out.println(line); } }catch (IOException e) { throw new RuntimeException(); }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
시간추출오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. https://www.inflearn.com/course/lecture?courseSlug=스프링-입문-스프링부트&unitId=49600&category=questionDetail&tab=community&q=815548
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello.html 부분 오류 ..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]11행 부분에서 자꾸 오류가 뜨네요 ...
-
해결됨실전! 스프링 데이터 JPA
fetchjoin시 QueryDsl과 @EntityGraph 사용 기준
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님. QueryDsl과 @EntityGraph 사용 기준에 대해 궁금한 부분이 생겨서 질문 남깁니다.fetchJoin을 할 때, 여러가지 방법이 있겠지만 QueryDsl과 @EntityGraph이 가장 편리한 방법이라고 생각합니다. 저의 경우엔 @EntityGraph가 가독성이 더 좋다고 느껴서 간단한 조회용 페치조인의 경우에 사용하고, 검색조건이 있는 복잡한 조회의 경우엔 Querydsl을 사용하는데요. 실제로 이 둘을 사용할 때 어떤 것에 우선순위를 두시는지 궁금합니다. 강의 잘 듣고 있습니다. 감사합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
이번 강의부분은 코드작성 안해도되나요?
듣기만 하라고 하셨는데코드 안따라가도 뒤에 jpa영상에서 문제없나요?
-
미해결
@Builder에 대해서 질문이 있습니다.
스프링 부트에서 DTO를 만들 때 @setter을 빼고 @Builder로 하는게 좋다고 들었습니다.근데 책이랑 구글을 찾아보다 보니 두 가지의 방법으로 하는 것을 봤는데 무슨 차이인지 무엇이 더 좋은 방법인지를 모르겠어서 질문드립니다. 생성자 위에 @Builder를 사용하는 방법@Getter //Getter 생성 public class LombokPerson { private String name; private String grade; private int age; @Builder // 생성자 만든 후 위에 @Build 어노테이션 적용 public LombokPerson(String name, String grade, int age) { this.name = name; this.grade = grade; this.age = age; } 클래스 위에 @Builder를 사용하면서 @Setter도 사용하는 방법@ToString @Setter @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class UserDTO { private String token; private String userName; private String password; private String id; } 2번째의 방법이 책에서 나온 방법인데 @Setter이 바뀔 수도 있어서 @Builder로 생성자로 받는거로 알고 있는데 여기서는 @Setter과 @Builder을 같이 쓰더라구여. 이거에 대해서 알려주세요 ㅠㅠ