묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
35강 리팩토링 중에서 질문입니다.
안녕하세요 강사님, 제가 이제 막 개발을 시작한 신입이다보니 db와 자바가 아직 서툴어서 굉장히 이상한 질문을 드리는 것 같은데요.강의 7분..쯤, 도메인 계층에 비지니스 로직을 구현하면서 User 객체에서 작성된 returnBook()메소드관련 질문입니다. 반납을 위해서 Service에서 찾은 유저의 대출 히스토리에서 targetHistory를 찾기 위해 stream()이 시작되고, UserLoanHistory 객체를 필터링하는 중에, ".findFirst()"로 필터를 하신 이유를 문의드립니다.왜 마지막이 아니고, 첫번째를 찾나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속 관련 질문있습니다.
OrderService에서 order메소드에 public Long order(Member member, Item item) 이런식으로 id가 아닌 엔티티 객체를 바로 받는 식으로 제 개인 프로젝트에서 비슷한 방식으로 해봤습니다.Question과 member가 서로 양방향 매핑관계이구요public class Question { @Id @GeneratedValue @Column(name = "question_id") private Long id; private String title; private String content; private String username; @CreationTimestamp private LocalDateTime dateTime; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; public void setMember(Member member) { this.member = member; member.getQuestionList().add(this); } }public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String emailId; private String username; private String password; private int age; @OneToMany(mappedBy = "member") private List<Question> questionList=new ArrayList<>();OrderService에서 question을 save할 때 public Question save(Member member,Question question) { question.setMember(member); question.setUsername(member.getUsername()); question.setTitle(question.getTitle()); question.setContent(question.getContent()); questionRepository.save(question); return question; }failed to lazily initialize a collection of role: post.study.entity.Member.questionList, could not initialize proxy - no Session(제 개인 프로젝트라 엔티티 경로가 다릅니다.)이런식으로 에러가 나더라구요. 이게 controller 단에서 들어온 엔티티라 해당 서비스 트렌젝션 내에서는 JPA가 관리해주지 않는 준영속 상태 같은 개념인 것 같은데 정확하게 개념이 잡히지 않아서 질문드립니다.public Question save(Long memberId, Long questionId) { Member member = memberRepository.findById(memberId).get(); Question question = questionRepository.findById(questionId).get(); question.setMember(member); question.setUsername(member.getUsername()); question.setTitle(question.getTitle()); question.setContent(question.getContent()); questionRepository.save(question); return question; }id값을 받아서 해당 서비스 트렌젝션 내에서 직접 엔티티를 조회해야 같은 트렌젝션 내에서 엔티티가 JPA에 의해 관리되서 그런건가요? 개념을 정확히 잡고 싶습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링 부트 버전
[질문 내용]스프링 부트 2.7.9 버전 쓰면 될까요??3.0.4 도 있는데 둘 중에 뭘 고르면 될까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 생성, View 환경 설정
제목의 두 강의에서 빌드 시 강사님께서는 그냥 빌드하고 넘어가시는데edit configuration에서 name 및 main class를 설정하는 행위의 빌드 환경설정이 필요한 것 같습니다. 현재 HelloController를 작성했지만 빌드 시 cannot find symbol 오류가 뜹니다. 환경설정 하는 부분도 강의자료에 남겨주시기 바랍니다. 이거 때문에 시간을 많이 날리네요...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
db 초기화할때, 새로운 인스턴스의 메서드를 사용했는데 기존의 인스턴스가 영향 받을 수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]MemberServiceTest 파일을 보면,MemberService 객체 인스턴스 내부에서 MemoryMemberRepository 객체를 생성하여 db로사용하고 있는데,다시 아래에 MemoryMmeberRepository 객체 인스턴스를 생성하면 새로운 db가 또 생기게 되는데서로 다른 db아닌가요?? 왜 아래 MemoryMemberRepository 인스턴스의 내장메서드를 사용하면 MemberService 인스턴스 내부의 db가 초기화 되는지 궁금합니다!! 추가) 뒷 내용을 보면 나중에 db를 합치는데 이 부분은 이해가 됩니다.. 앞 부분에선 뭘 간과한 걸까요..ㅎ
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
RSA 비대칭키 질문
HS256 암호화 방식은 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature)를 받으면, 서버가 "비밀키"를 가지고 있어서, 서버가 만든 JWT랑 비교해서 같은지 검증하는 방식이잖아요?RSA 암호화 방식은 마찬가지로 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature) 받으면, 서버는 JWT의 signature를 "공개키"로 검증한다고 이해했습니다. 그래야만 "비대칭키" 방식이기 때문입니다. 여기서 질문입니다. 1. 서버는 비밀키도 있으면서 왜 굳이 공개키로 검증하는지 (비밀키만 있으면 HS256 방식을 사용하면 돼서)2. 공개키로 검증하는게 맞다면 어떤 방식으로 검증하는지 (signature를 공개키로 복호화 하면 비밀키가 나오는 방식일까요?)긴 글 읽어주셔서 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
localhost:8080에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]인텔리제이에서 run실행하는것도 잘 되었고이 상태로 localhost:8080을 했을때이렇게 떠서 다른 작성자분께 조언하신데로 crd로 들어가서 똑같이 했는데도이렇게 뜹니다. 스프링부트마크가 없어도 괜찮은 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
라이브러리 인식?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]외부 라이브러리 인식이 잘 되지 않습니다. 여러가지 방법을 시도해봤더니.. 왼쪽 목록에서 build.gradle 오류표시가 사라지지않습니다....테스트와 http://localhost:8080 로 확인 하였으나 따로 오류 발생은 하지 않았습니다. 외부라이브러리만 인식이 안되는 것 같은데 이유를 알수있을까요?build.gradleplugins { id 'java' id 'org.springframework.boot' version '2.7.8' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'jpabook' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' developmentOnly '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' //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } test { useJUnitPlatform() } 외부라이브러리 주소는 implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:${version}") implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' 이거 두개 사용해 봤고 깃허브에 나온 버전 다른 것도 사용시 안됨요 memberRepositoryTestpackage jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import ch.qos.logback.core.joran.conditional.IfAction; @RunWith(SpringRunner.class) //스프링과 관련된걸 테스트 할거야~ @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) //롤백안하고 커밋하는 것 public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); System.out.println("findMember==member : "+ (findMember == member)); } }
-
미해결스프링 시큐리티
쿠키의 단점을 보완한 세션
쿠키 값을 변조 가능, → 예상 불가능한 복잡한 세션Id를 사용한다.-> 그런데 세션도 변조가능한거아닌가요? 그냥 더 예상이 불가능하다는건가요? 쿠키값도 랜덤값을 사용한다고 알고있어서요... 쿠키에 보관하는 정보는 클라이언트 해킹시 털릴 가능성이 있다. → 세션Id가 털려도 여기에는 중요한 정보가 없다.-> 쿠키에 보관하는 정보는 보통 그럼 중요한 정보를 보관하는건가요..? 왜 중요한 정보를 보관하는거죠 털릴수도있는데..
-
미해결스프링 시큐리티
쿠키가 세션보다 보안에 취약한 이유가 뭔가요?
쿠키가 세션보다 보안에 취약한 이유가 잘 이해가 가지 않습니다1. 쿠키가 세션보다 더 털릴 가능성이 높아서인가요?근데 세션도 결국 쿠키의 형태로 로컬에 저장되잖아요!2. 그리고 chatgpt에게 물어보니 쿠키는 클라가 변경할 수 있는데 세션은 변경을 못한다고 합니다. 세션이더라도 다른사람의 세션id값을 탈취할 수만있다면 헤더값만 변경하면 클라가 변경할 수 있게 되는거잖아요.그래서 챗지피티가 한말이 이해가 잘안가네요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성메소드
생성메소드에 대해 잘 이해가 안가네요어떨때 사용하게 되는건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
cascade, orphanRemoval에 관련하여 질문드립니다.
강사님 안녕하세요. 아까 올렸던 반납 관련 질문에 대해서는 정말 좋은 답변 감사하다는 말씀 먼저 드리고 싶습니다. 이번 강의에서 cascade, orphanremoval을 설정하면 연관데이터가 함께 삭제되는 것으로 이해하였습니다. 그런데 cascade, orphanremoval가 따로 설정되어있지 않는 경우에 onetoMany로 연관관계가 설정되어있는데도, 둘 중 하나의 테이블에서 데이터를 삭제했을때 문제가 없다는 점은 연관관계?라고 할 수 없는 부분도 있다고 생각하는데 혹시 제가 잘못 이해한 것일까요?예전에 mysql을 배울때는 한 테이블에 외래키 제약 조건을 걸면 부모테이블의 데이터를 삭제할때 에러가 뜨는것으로 배웠던 기억이 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 생성 메서드 createOrder() 질문
==[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]주문 생성 메서드인 createOrder()의 파라미터로 가변인자인 OrderItem...을 사용하셨는데 List를 사용하지 않고 특별히 가변인자를 사용하신 이유가 있을까요?
-
해결됨스프링 부트 - 핵심 원리와 활용
선생님 안녕하세요 단순 질문입니다.
스프링 하면 김영한 이라는 말을 많이 들어서 이번에 오픈 기념 처음 수강하는 수강생입니다.자바 17버전을 사용하는 이유가 있을까요?또한 제가 진행한 프로젝트에서는 Maven을 사용했는데 Gradle을 사용하는 이유가 있을까요?Gradle을 2~3년전 안드로이드에서 처음 접해봤었는데 그때는 버그도 많고 그래서 선입견이 조금 있네요 ㅎㅎ,,
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
반납 기능 관련해서 질문드립니다.
강사님 안녕하세요. 이번 강의에서 BookService에 returnBook을 만들어주었는데요, 실행을 하면 반납을 했음에도 불구하고, 같은 이름의 사용자가 이미 반납한 책을 또다시 반납해도 오류가 발생하지 않고, 반납에 성공했다고 결과가 나오는 것을 알게되었습니다.제 생각에는 UserLoanHistory history = userLoanHistoryRepository.findByUserIdAndBookName(user.getId(), request.getBookName()) .orElseThrow(IllegalArgumentException::new);해당 코드에서 findby부분에is return도 추가하여 userLoanHistoryRepository.findByUserIdAndBookNameAndIsReturn(user.getId(), request.getBookName(), false)로 해주어야 대출중인 책을 반납하는 동작이 한번 이루어지고, 중복반납이 안될거 같은데 혹시 제가 이해를 잘못한건지 궁금합니다. 감사합니다!
-
미해결실전! 스프링 데이터 JPA
entity수정
//@NoArgsConstructor(access = AccessLevel.PROTECTED)setter사용은 신중하게 선택하라고 하셨는데,Service에서 수정을 하려고 하때, setter사용안하고 생성자로 수정을 하려고 했지만 안되었습니다.service에서 entity 수정시에는 무조건 setter 수정해야한가요??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
보상 트랜잭션의 대한 후속 강의 문의합니다.
강의를 다 들어가는데요~ msa에서 예외가 발생 시 보상 트랜잭션의 대한 후속 강의를 제작한다고 들었습니다!해당 후속 강의는 정말 중요한 강의라고 생각되는데.. 언제쯤 업데이트 하실 계획이실까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
30강 오류
안녕하세요 선생님.30강에서 서버를 실행시키고 책 등록을 하면 오류가 뜹니다. 그런데 application.yml 설정 중 jpa hibernate ddl-auto를 create drop으로 바꾸면 오류가 안 뜨고 책 등록이 되긴 하는데 서버를 다시 시작하면 테이블이 사라집니다. 이걸 어떻게 해야 할까요?감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
왜 오류가 안날까요?
영상 11:00부분 부터, 테스트가 끝날 때마다 초기화되는 AfterEach부분을 적지 않았음에도 불구하고 정상실행 됩니다. findByName()이 왜 오류가 안날까요?스프링이 업그레이드 되면서 자동으로 clear하는 기능이 생겼나 싶어서 찾아보니까 그런내용은 없었는데, 혹시 오류가 안나는 이유를 알 수 있을까요?package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.*; class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @Test public void save() { //given Member member = new Member(); member.setName("spring"); //when repository.save(member); //then Member result = repository.findById(member.getId()).get(); assertThat(result).isEqualTo(member); } @Test public void findByName() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when Member result = repository.findByName("spring1").get(); assertThat(result).isEqualTo(member1); } @Test public void findAll() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when List<Member> result = repository.findAll(); //then assertThat(result.size()).isEqualTo(2); } }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
view의 개념
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의 1분 정도에 View는 화면을 그리는데 모든 역량을 집중해야 한다고 말씀해주셨는데 아래의 케이스에서는 어느 영역에서 처리하나요?db의 데이터 Y, N 또는 True, False의 데이터가 있을 경우 화면에는 예, 아니오 또는 사용, 미사용 과 같이 처리 할 경우 DB에서 조회 시, Service에서 if 또는 case 문으로 처리 가능하고, Front에서도 처리 가능한데 DB 또는 Service에서 처리 할 경우 해당 값이 변경 되야하면 서버를 재기동하는 부담이 있고, Front에서 할 경우는 단순 파일 배포를 통해 재기동하지 않아도 된다는 장점이 있을 것 같습니다.어느게 정답일 수는 없겠지만 보통은 어떻게 처리하는지 궁금합니다.