묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
글동록하는부분에서 등록을 하고나면 나이부분에 값이 00세라고들어가네요 이유가뭘까요??
객채셍성하고 등록화면부분올려드렷어요
-
해결됨실전! Querydsl
강사님 Pageable->OrderSpecifier 변환 질문이 있습니다.
강의는 스프링 데이터 페이징 활용 3 - 컨트롤러 개발시간은 6:33코드는for (Sort.Order o : pageable.getSort()) { PathBuilder pathBuilder = new PathBuilder(member.getType(), member.getMetadata()); query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,pathBuilder.get(o.getProperty()))); List<MemberTeamDto> content = query.fetch(); }루트 엔티티가 현재는 member 입니다. 직접 테스트해보고 싶어서 임의의 엔티티 user를 만들고 left join으로 묶었습니다@Override public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { JPAQuery<MemberTeamDto> query = factory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name, user.name)) .from(member) .leftJoin(member.team, team) .leftJoin(user).on(team.id.eq(user.id)) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()); JPAQuery<Long> countQuery = factory .select(member.count()) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())); for (Sort.Order order : pageable.getSort()) { PathBuilder pathBuilder; if (order.getProperty().equals("name")) { pathBuilder = new PathBuilder<>(user.getType(), user.getMetadata()); } else { pathBuilder = new PathBuilder<>(member.getType(), member.getMetadata()); } query.orderBy(new OrderSpecifier(order.isAscending()? Order.ASC:Order.DESC,pathBuilder.get(order.getProperty()))); } List<MemberTeamDto> content = query.fetch(); return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); }left join user를 추가하고 조건은 user.id = team.id 로 했습니다.http://localhost:8080/v2/members?page=0&size=3&sort=name,asc&sort=username,asc실행되는 SQL은select m1_0.member_id, m1_0.username, m1_0.age, m1_0.team_id, t1_0.name, u1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id left join users u1_0 on m1_0.team_id=u1_0.id order by u1_0.name, m1_0.username limit 0,3;단순한 경우에는 상관이 없지만 조인하는 경우에는 동작을 잘 안한다고 설명을 해주셔서 간단하게 테스트를 해봤는데 동작을 하더라구요 강의 이후에 오류가 수정되어 해결이 된건지 아니면 제가 테스트를 잘못한걸까요?아니면 강사님께서 말씀하신 경우가 이 경우가 아닌 걸까요 ?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
섹션 4엔티티 매핑 질문입니다.
1. 객체와 테이블 매핑 5분 29초에서@entity역할이 member라는 클래스라는 설계도를 기준으로 그림처럼 meber1entity,meber2entity,meber3entity 이런식으로 나타내게 하는 역할인가요?기본 키 매핑 34분에서 아래그림 빨간색 박스처럼 em.persist(member52)하면 db sql=51 ||52 이렇게 되니까 에러나는거 아닌가요? 50이 아니라 기본 값을 그러면 10000을 줘야 하는거 아니에요? 37분에서는 1번쨰는 1부터 51까지 주고 2번째는 51부터 100까지 준다는데 이게 무슨 뜻인지 이해가 어려워서요..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
준영속 상태 질문입니다.
1. 위사진에서 분홍색 박스 부분 select가 왜나오는거에요? find를 실행하면 나온느건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 2 강 질문있습니다.
1. 7분 1초 그림과 7분 9초 그림이랑 차이가 뭔가요? 혹시 7분 1초 그림에서 3번이 7분 9초 그림인건가요?2. 13분에 내부적으로 리프랙션을 하기때문에 동적으로 생성자를 생성해야 한다고 하셨는데요.리프랙션은 뭐고 동적은 무슨의미인가요? 움직임을 뜻하는건 아닌것 같아서요3. 23분에 1번에는 flush() 이렇게 되어있고 4번에는 flush 이렇게 되어있는데 혹시 flush 가 2번 실행되는건가요?첫째코드가 강의 Hello JPA - 애플리케이션 개발28분에 나온 코드이고 2번째코드가 영속성 컨텍스트 2 24분에서 나온코드입니다.List<Member> result=em.createQuery("select m from Member as m",Member.class).getResultList(); //Member 객체를 m으로 별칭하고 객체 m을 선택해라 for (Member member:result){// 각 Member 엔터티에 대해 반복합니다. System.out.println("member name = " + member.getName()); }Member member=em.find(Mmeber.class,150L);를 List<Member> member=em.find(Mmeber.class,150L); 이렇게 바꿔도 되나요? 4.영속성 컨텍스트 2 7분 그림에서요. 그림에서 flash는 3번과정인가요? 아니면 3번과정 직전인 동기화 상태인가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V2에서 별도의 DTO를 사용하는 이유가 궁금합니다.
안녕하세요 강사님!Entity를 바로사용 하지 않는 이유는보안에 취약여러 곳에서 사용하기 때문에 entity가 바뀌면 곤란함이 두가지 때문이라고 이해했는데.V2의 경우에는 별도의 DTO를 구성해서 이를 해결한다고 말씀을 해주셨습니다. 하지만 사용 쓰임새가 다 다르면 별도의 DTO를 계속해서 고쳐줘야 하는건 V1과 마찬가지 아닌가요? 보안 문제만 해결할 수 있는 것처럼 보이는데 원리를 이해하지 못하겠습니다.
-
해결됨실전! Querydsl
querydsl Projection 성능 문제
안녕하세요 Querydsl Projection 을 활용해 DTO에 담는경우 성능 관련 질문이 있습니다. Querydsl에서 Projections.constructor를 활용해서 query를 작성하는경우 fetchJoin이 되지 않더라구요.일대 다 관계에서 fetchJoin을 하지 않게되면 n+1 이슈가 발생할거 같은데Projections을 활용하는 환경에서 성능개선은 어떻게 해야할까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Hello JPA - 프로젝트 생성 강의 질문있습니다.
Hello JPA - 프로젝트 생성18분 3초에 mysql 사용시 2번째 네모박스 뿐만 아니라 첫번째 박스도 변경해야 하는거 아닌가요?2. Hello JPA - 애플리케이션 개발 3분 8초해당 강의 부분에서 EntityManagerFactory emf =Persistence.createEntityManagerFactory("hello"); 입력후 실행하면 커넥션이 떠야 한다고 했는데 저는 커넥션이 안뜨는데요.아래같이 뜹니다. 어떻게 해야 하나요? public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf =Persistence.createEntityManagerFactory("hello");//persistence.xml에서 유닛 네임을 넘겨주면 된다. // EntityManager entityManager=emf.createEntityManager(); // entityManager.close(); // emf.close(); } } 3. 6분에서 빨간색 네모박스는 왜 안지워요?8분22초에서 distance가 뭘 의미하는건가요?17분 3초에서 아래 문장이 엔티티 매니저가 찾는 것을 Member객체 형태로 findMember의 변수로 저장해라 라는 문구로 이해 해도 되나요? Member findMember=em.find(Member.class,1l);근데 Member.class 이건 왜나오는거에요? 29분에 쿼리문 설명할 때 엔티티를 표현한다거나 객체를 표현하는걸로 이해하시면 된다고 하셨는데요.https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=zzu0e&logNo=220689973139 근데 이 주소를 보면 두개 가 다른것 같은데 뭐가맞는건가요?31분에 와스가 내려갈때 emf를 닫아줘야 한다고 하셨는데 와스가 뭐에요?
-
미해결스프링 시큐리티
AjaxAuthenticationProvider에서 authenticate 함수 재정의 할 때 @Transactional 관련 질의입니다.
안녕하세요. 강의 잘 듣고 있습니다.제가 수강하는 시점엔 SpringBoot 3.x.x, security6를 써야 하지만, security5과 아키텍처는 대동소이할 거 같아 수업과 동일한 환경에서 강의 듣고 있습니다.강사님 영상에서 10:45 보시면 authenticate()에 @Transactional이 들어가있는데요. 제가 실습 환경에서는, 이 애노테이션 때문인 것 같은데, AjaxAuthenticationProvider 프록시 객체 생성에서 에러가 발생합니다.대체 @Transactional이랑 무슨 상관인지는 파악하지 못했지만 설마..하고 해당 애노테이션을 지우고 나니 AjaxAuthentication 프록시 객체가 잘 생성되고 정상 동작을 하더라고요.이유가 정말 궁금합니다.좋은 강의 감사합니다.
-
미해결김영한의 실전 자바 - 기본편
기본 생성자 생략에 관한 질문입니다.
생성자 내부에서 첫 줄에 기본 생성자를 적어줘야하지만 매개변수가 없을 땐 생략 가능하다고 나와있는데 매개변수 부분이 없다는게 부모 클래스에서의 생성자인 Class A() 기준인가요?=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 시큐리티 OAuth2
access_token 받은후 유저정보요청시 에러
안녕하세요 선생님 강의 진행중 오류가 해결되지 않아 이렇게 문의를 남깁니다. 다름이 아니라 제가 access_token을 받고 http://localhost:8081/user?accessToken=access_token이렇게 요청을 보내면OAuth2User oAuth2User = defaultOAuth2UserService.loadUser(oAuth2UserRequest);의 loadUser부분의 ResponseEntity<Map<String, Object>> response = getResponse(userRequest, request);에서 사진과 같이 RestClientException이 발생하고 그 이유는 body null 이기 때문이라는데 여기서 어떻게 손을 써야 오류가 고쳐질지 모르겠습니다. 혹시 해결방법을 아시는지 궁금합니다.
-
해결됨실전! Querydsl
stringTemplate("...") 은 어떻게 찾으신건가요?
공식 문서 5.0.0 버전을 봐도 stringTemplate이나 function에 대한 소개가 없더라구요 이렇게 공식문서에서 찾을 수 없는 내용을 강사님께서는 어떻게 찾으시는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test중 NullPointerException에러발생
jpa와 db설정, 동작확인 강의를 듣고 클론코딩 중test중 NullPointerException에러발생mainjpabook.jpashop.Memberpackage jpabook.jpashop; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; }jpabook.jpashop.MemberRepositorypackage jpabook.jpashop; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository public class MemberRepository { @PersistenceContext EntityManager em; public Long save(Member member) { em.persist(member); return member.getId(); } public Member find(Long id) { return em.find(Member.class, id); } } testjpabook.jpashop.MemberRepositoryTestpackage jpabook.jpashop; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } } application.ymlspring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug org.hibernate.type: trace build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } group = 'jpabook' 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-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }build, run 모두 intellj IDE로 하는중입니다.
-
미해결실전! Querydsl
BooleanBuilder 사용 방법에 대해서
private BooleanBuilder searchName(String name) { if (name == null || name.isBlank()) { return new BooleanBuilder(); } return new BooleanBuilder(QMember.member.username.eq(name)); } private BooleanBuilder searchAge(Integer age) { if (age == null) { return new BooleanBuilder(); } return new BooleanBuilder(QMember.member.age.eq(age)); } private BooleanBuilder allCond(String username, Integer age) { return searchName(username).or(searchAge(age)); } @DisplayName("BooleanBuilder 연속 사용") @Test void pr2(){ //given em.persist(new Member("둘리",15)); em.persist(new Member("또치",20)); em.flush(); em.clear(); QMember member = QMember.member; List<Member> findMember = queryFactory .select(member) .from(member) .where(searchName("name").and(searchAge(null)).and(searchAge(15))) .fetch(); System.out.println("findMember = " + findMember); }null 여부에 따라 Expression을 추가하거나 new BooleanBuilder를 반환하면and나 or일 경우 내부에서 합치거나 치환하는 방식을 통해 최종 BooleanBuilder를 사용할 수 잇더라구요public BooleanBuilder or(@Nullable Predicate right) { if (right != null) { if (predicate == null) { predicate = right; } else { predicate = ExpressionUtils.or(predicate, right); } } return this; }이렇게 사용하는 방법은 BooleanExpression을 사용하면 null 체크를 해야하는데따로 기존에 있는 메소드에서 null을 체크해야주기 때문에 좋을 거같은데단점은 매번 쿼리를 실행할 때마다 저 많은 조건문이 실행되니까 비효율적일까요 ?
-
미해결김영한의 실전 자바 - 기본편
3. 객체 지향 프로그래밍 질문
package oop1.ex; public class Ex1Rectangle { int height; int width; int area; int perimeter; void calculateArea() { area = width * height; System.out.println("넓이: " + area); } void calculatePerimeter() { perimeter = 2 * (width + height); System.out.println("둘레: " + perimeter); } void isSquare() { boolean isSquare = width == height; System.out.println("정사각형 여부: "+ isSquare); } }package oop1.ex; public class Ex1RectangleObjectMain { public static void main(String[] args) { Ex1Rectangle rectangle = new Ex1Rectangle(); rectangle.height = 8; rectangle.width = 5; rectangle.calculateArea(); rectangle.calculatePerimeter(); rectangle.isSquare(); } }[질문 내용]3. 객체지향 프로그래밍 문제 1번의 제공된 정답에서는System.out.println으로 출력하는 부분을 main메서드 안에 남겨두었고,제가 문제를 푸는 과정에서는객체 클래스에 int area와 int perimeter를 선언한 후, 각 메서드를 int와 boolean값을 반환하지 않는 void메서드로 변경하고, 계산된 값을 출력하는 부분을 각 메서드 안에 넣어놓고,main메서드에서는 int width와 int height의 값을 지정하고 객체 클래스의 메서드들을 호출만 했고 같은 결과가 나오는데,둘 중 어느 것이 효율적이고 여러 방면에서 좋은 코드인가요??
-
미해결실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌
일반적으로 로그인 상태 판정을 쿠키로 하나요?
안녕하세요, 강의 잘 듣고 있습니다.본 영상에서는 memberId가 쿠키에 존재하면 로그인이 된 상태라고 간주하는데요실무에서도 이와 같은 방식으로 로그인 여부를 판정하는지 궁금합니다. 만약 쿠키를 사용하여 로그인 여부를 판정하게 된다면사용자 측에서 쿠키를 조작할 수 있기 때문에로그인이 되어 있지 않더라도 loginOk 페이지에 접근할 수 있을 것으로 보입니다. 간단하게 로그인을 성공했는지 여부만 따질때는본 예제처럼 쿠키 값을 이용하여 판별하는 경우도 많은지 궁금합니다.
-
미해결김영한의 실전 자바 - 기본편
코드 구현력
안녕하세요 영한님. 강의를 보면서 한층 더 발전한 것 같습니다.실제 문제2를 풀면서 변하는 부분은 결제 종류가 추가되는 부분이고 나머지는 수정되지 않는 것을 보면서이게 클린코드인가..? 이런 생각을 했습니다. 이런 식의 코드 구현력을 공부하려면 디자인 패턴을 공부해야 할까요 ? 한마디로 클린코드를 짜기 위해서 디자인 패턴에 대한 내용을 공부하면 어느정도 코드가 보이는 걸까요 ?
-
미해결스프링 시큐리티 OAuth2
Resouce Server에서 JWT 토큰 검증 후 로직추가
Resource Server 에서 JWT 토큰 검증 후 access token 에서 claim 을 추출하여 인증된 사용자의 추가 정보를 DB에 조회 후 SecurityContextHolder 에 저장하는 로직을 추가 하려고 합니다. Resource Server 에서 커스터 마이징이 가능한게 AuthenticationManager와 JwtAuthenticationConverter 등등인데 JwtAuthenticationConverter 은 적합하지 않을거 같아 AuthenticationManager에 JwtAuthenticationProvider 커스터 구현체를 등록해서 진행해야 할거 같은데 더 좋은 방벙이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
expected 옵션이 적용되지 않아 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. junit4 적용된걸 확인했는데도 test에서 적용이 안돼 질문드립니다 orderServiceTest 상품주문_재고수량초과 @TEST에서 expeced 오류로 뜹니다. @Test(expeced = NotEnoughStockException.class); public void 상품주문_재고수량초과() throws Exception{ //given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); int orderCount =11; //when //Assertions.assertThatThrownBy(()->orderService.order(member.getId(), createBook().getId(). orderCount)) // .isInstanceOf(NotEnoughStockException.class); orderService.order(member.getId(), item.getId(), orderCount); //then fail("재고 수량 부족 예외가 발생해야한다"); build.gradledependencies { 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' implementation 'org.springframework.boot:spring-boot-devtools' implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6") testImplementation 'junit:junit:4.13.1' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } }
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
인텔리제이 폰트 색상 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의를 수강중인 사람입니다. 인텔리제이 2023을 써도 저는 영한님처럼 코드 색상이 안나오네요.. 혹시 맥과 윈도우의 차이일까요? 아니면 다른 설정이 필요한건가요?