묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
스프링부트 버전관련 질문
안녕하세요 멘토님! 프로젝트앱을 다운받아 열었더니 빌드후에 다음과 같이 오류가 나타납니다.. 전에 프로젝트를 3.xx버전으로 했어서 이 경우에 java 17이상만 가능하기 때문에 java11을 사용하지 못해 나는 오류인것 같은데 어떻게 진행하면 될까요? problem occurred configuring root project 'library-app'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.1. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.1 > No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.5' but: - Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 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 8 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 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 8) - 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.5') - Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 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 8 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 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 8 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 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 8 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 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 8) - 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.5')
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
제 mysql 이 적용이 안되는 이유를 알아냈습니다.
연결이 위험하다면서 자꾸 제 local로 바뀌네요 전 여기서 해결하고싶은데 ... 어떻게 하면 다음페이지인 인덱스들도 접속 가능하게 할까요?? 그 url에서 http://localhost:8081/start.html 이런식으로 url 이 변경되며 화면이 전환되는 스타일인데 그게 안됩니다 ㅠㅠ
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
메서드명 컬러의 의미
강사님 화면을 보면addTwoNumbers, multiplyTwoNumbers 같은 메서드명 (메서드가 맞나요.. 제가 자바가 아직 서툴러서😅)이 노란색으로 표시되는데 저는 회색으로 표시됩니다.이거 글자 색에 어떤 의미가 따로 있나요? 그리고 터미널에도 강사님은 INFO나 WARN 같은 글자들이 컬러로 표시되는데저는 그냥 다 하얗게 보여서요. 강사님과 똑같이 세팅하려면 어떻게 해야 하나요?검색해서 settings에 있는 semantic highlighting 적용해 봤는데 똑같이 안되는 거 같아요
-
해결됨실전! 스프링 데이터 JPA
강의 내용 중 testEntity 관련 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. @SpringBootTest @Transactional @Rollback(value = false) class MemberTest { @Autowired EntityManager em; @Test public void testEntity() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m join fetch m.team", Member.class) .getResultList(); assertThat(members.get(0).getTeam()).isEqualTo(teamA); } }제가 작성한 테스트 코드는 위와 같습니다. 발생한 에러는org.opentest4j.AssertionFailedError: expected: "Team(id=1, name=teamA) (Team@3ec52163)" but was: "Team(id=1, name=teamA) (Team@100d071)" Expected :Team(id=1, name=teamA) Actual :Team(id=1, name=teamA) 위와 같습니다. 하나의 트랜잭션 안에서는 엔티티의 식별자가 같은 경우 ==비교를 하였을때 true라고 알고 있습니다.따라서 저는 member1의 team(teamA)과 teamA를 isEqualTo로 비교하였을때 true가 나올것이라 예상하였지만 false가 나왔습니다. 에러 문구를 보면 객체 주소가 달라서 false가 나온것 같아 Team엔티티에 equalsAndHashCode 오버라이딩을 해주어도 false가 나옵니다.물론 em.flush(), em.clear()를 하지 않고 영속성 컨텍스트에서 조회를 해오면 true가 나오는데 왜 영속성 컨텍스트를 초기화하고 DB에서 데이터를 가져오면 식별자가 같아도 같은 트랜잭션 내에서 ==비교가 true가 나오지 않는지 궁금합니다!
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
인텔리제이 테마?
안녕하세요. 강의 보면서 잘 따라가는 중인데요 인텔리제이 화면 모습이 강사님 화면이랑 좀 다른데혹시 테마가 달라서 그런 걸까요? 강사님 화면제 화면 아 그리고 강사님 화면 보면 "/add" 앞에 지구 모양이 생겨있는데 저는 이런게 안생겨요.. 이건 뭔가 설정을 해줘야하는건가요?그리고 지구 모양이 있는게 무슨 의미인가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
단어뒤집기 런타임에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! 단어뒤집기에서, 제 코드 왜 runtime error가 나는지 보이지가 않아서 질문드립니다..ㅜimport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); for (int i = 0; i < N; i++) { String str = in.next(); String answer = ""; for (int j = str.length() - 1; j >= 0; j--) { answer += str.charAt(j); } System.out.println(answer); } } } string이 계속 생성돼서 그런걸까요?
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
Main class에 static으로 선언하는 이유
강의 영상마다 질문이 있으면 언제든 그리고 바로 질문 남겨주세요! 질문할 때 가장 정확하게 이해할 수 있습니다.해당 영상과 관련된 질문들을 해주실 때 제가 가장 정확히 답변 드릴 수 있습니다!취업 전반의 상담이나, "제 코드가 왜 틀렸는지 알려주세요"와 같이 광범위한 질문은, 질문자의 상황에 따라 답변이 달라질 수 있기 때문에, 정확한 답변을 드리기가 어렵습니다 :(이런 분들을 위해서는 멘토링 항목으로 별도 제공하고 있으니, 다음 링크를 참고해주세요!이 링크를 통해서는 본인의 코드가 왜 틀렸는지 모를 때 질문을 주셔도 좋고, 취업 전반(면접 준비, 자소서, CS 면접 등)에 관련한 질문을 주시면 답변 드리겠습니다 :)"이 질문은 해도 되나?"라는 생각이 드신다면 우선 남겨주세요! 제가 답변 드리기 어려운 건 멘토링에 올려 달라고 재요청 드리겠습니다 :) 안녕하세요!혹시 Main class에 static으로 변수를 선언하는 이유가 궁금합니다!또한, 백준에서 public static void main 에 선언했을 때와 차이가 궁금합니다..!! 감사합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
배포해서 서버접속하는것까지 성공하였습니다
다만 궁금한것이 데이터베이스에 든게 없어서 배포하고 올린다음에 다시 내리고 데이터베이스 mysql채우고 다시 nohup으로 올렸는데 반영이 안되더라고요 어떻게 반영시키나요??
-
해결됨
자바 인터페이스의 객체
인터페이스는 일단 객체를 못만든다고 알고 있어요근데 익명이너클래스를 이용해서 만드는 방법이 있던데 interface A{ abstract void abc();}이거를A a = new A(){ public void abc(){.....}};이렇게 할 수 있던데 익명이너클래스에 인터페이스를 상속해서 abstract메서드를 오버라이딩 했기때문에가능하다는 건 알겠는데 그러면 객체는 익명이너클래스의 객체 아닌가요...? 익명객체가 인터페이스A를 상속받았기때문에 다형적인 표현으로 A a 이렇게 표현이 가능한건가요?저런 표현이 가능한가요? 참조변수 a는 인터페이스A 타입인 객체를 가리킨다는 뜻 아닌가요..?근데 인터페이스는 객체를 못만든다고 배웠는데.. ㅠㅠㅠ 정말 이 부분이 이해가 안 갑니다 ㅠㅠㅠ왜 객체를 인터페이스 타입으로 지칭하는지 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Test - application.yml 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의를 따라 MemberRepositoryTest를 실행해도 h2데이터베이스에 Member테이블이 생성되지 않는 문제가 있었습니다. 강의를 여러번 돌려보고, 강의소스코드를 다운받아 실행해보아도 DB에 테이블이 생성되지 않았으며, 강의자료 pdf를 둘러보아도 해답이 없었습니다. 혹시나 하는 마음에 강의소스코드 중 test폴더 하위에 존재하는 application.yml을 확인하여 주석처리 된 것들을 다 해제하고 실행하니 그제야 h2DB에 member 테이블이 생성된 것을 확인하였습니다. 여기서 궁금한 점은 test파일을 실행할 때 test폴더 하위에 application.yml 파일이 존재해야하는지 입니다. 강의에서 강사님의 test폴더 아래 yml파일이 존재하지 않습니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
또다시 서버 접속 질문입니다 ㅠ 죄송합니다
이번엔 인바운드에 –sgr-060b562a401b266118081TCP::/0launch-wizard-3 을 규칙으로 넣었더니 빠르게 연결이 안된다고 뜹니다 어떻게 해결하나요?? 재차 질문드려서죄송합니다 ㅠㅠ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
배포까자 완료하였는데 검색하여 서버에 접속할 수 가 없습니다.
배포도 했고 서버도 켰고 swap 설정도하고 인바운드 규칙도 다열고 했는데 서버에 접속하는 시간이 너무 오래걸려서 접속이 안됩나다ㅠㅠ왜그런걸까요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
안녕하세요 나도코딩 선생님 :)
안녕하세요 나도코딩 선생님 :)곧 추석인데 잘 지내고 계신가요? 선생님 강의 복습하면서 보고있는데 항상 감사드립니다!다름이 아니라, 저도 해당 글쓴님과 같은 의문점이 들어 답변 주신 부분을 확인하였는데요, https://www.inflearn.com/questions/950351답변 주신 해당 부분을 반복해서 읽고 있는데 명확하게 이해가 되지 않아 질문드리는 점 양해 부탁드립니다(__ __)제가 이해한 바로는 Resolution()의 경우, null값으로 반환되어 if문을 getter로 작성하셨고, Price()의 경우는 특정 값 반환으로 인해 if문을 setter로 작성하신 점으로 이해해도 될까요? 추후 코드를 작성할 시 getter와 setter 중 어떤 조건으로 어디에 조건문을 작성하는 것일지 알고싶어 여쭈어봅니다!편안한 연휴 보내시길 바라며, 감사합니다! 전달값이 없는 단순한 getter 메소드는 일반적으로 그냥 인스턴스 변수의 값을 반환하는 역할을 수행합니다.하지만 getResolution() 과 같이 getter 메소드에 조건을 추가하는 이유는 해당 인스턴스 변수의 값이 특정 조건을 만족하지 않을 경우에 대응하는 로직을 제공하기 위해서입니다. 이러한 접근 방식은 일반적으로 값을 반환하는 단순한 getter 메소드에서는 유용합니다.이런 방식을 사용하는 이유는 몇 가지가 있는데요. 1. 안정성인스턴스 변수의 값이 null일 때 getter 메소드가 null을 반환하면, 클라이언트 코드에서 해당 값의 null 여부를 체크하여 잠재적인 문제(=NullPointerException)를 방지하는데 도움이 됩니다.2. 기본값 제공해당 인스턴스 변수가 기본값인 경우, 또는 아직 값이 설정되지 않은 경우를 대비하여 기본 메시지나 기본값을 반환할 수 있습니다.3. 클라이언트 코드 간소화클라이언트 코드에서 추가적인 null 체크나 예외 처리를 하지 않도록 도와줍니다.4. 의도 표현인스턴스 변수가 특정 조건을 만족하지 않을 때 어떤 동작을 하는지 미리 설명하는 역할을 합니다. 이번에는 setPrice() 에 대해 설명 드릴게요.setter 메소드는 주로 인스턴스 변수 값을 설정하는 역할을 합니다.하지만 때로는 값의 유효성을 검사하거나 특정 조건을 만족하지 않을 때 기본값이나 다른 값으로 설정해야 할 경우가 있는데 이때 setter 메소드에서 조건을 확인하고 특정 동작을 수행하는 것은 올바른 접근 방법일 수 있습니다.setPrice() 메소드는 price 인스턴스 변수를 설정하는데, 만약 price가 100,000보다 작으면 100,000으로 설정하고, 그렇지 않으면 주어진 price 값을 그대로 price 인스턴스 변수에 설정합니다. 이렇게 setter 메소드에 조건을 추가하여 값을 검증하고 처리하면 코드의 안정성과 유효성을 높일 수 있습니다. 예를 들어, price가 음수가 될 수 없거나 특정 범위를 벗어나면 이를 감지하고 기본값이나 다른 유효한 값으로 설정할 수 있게 되지요.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션 27분 30초 값 타입 컬렉션을 remove() 할 때 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요값 타입 컬렉션 27분 30초 질문드립니다. findMember.getAddressHistory().remove(new Address("old1", "street", "10000"));이 코드를 실행할 때deletefromADDRESSwhereMEMBER_ID=?이 쿼리가 실행되어 ADDRESS 테이블에서해당 멤버 id를 외래키로 가지는 레코드를 전부 지우는 것이 이해가 되지 않아서 질문드립니다.저는 자바 코드에서 MEMBER_ID, CITY, STREET, ZIPCODE 에 해당하는 정보를 모두 가지고 있기에아래의 쿼리가 실행되어, 레코드를 하나만 삭제해야 한다고 생각했습니다.deletefromADDRESSwhereMEMBER_ID=? (예를 들어 1)AND CITY=? (예를 들어 newCity1)AND STREET =? (예를 들어 street)AND ZIPCODE=? (예를 들어 10000)이러면 해당 레코드를 JPA에서 직접 식별하고 접근해서 삭제할 수 있을 것입니다.그런데 왜 JPA에서는 2번째 쿼리가 아닌 1번째 쿼리가 실행되어 불필요하게 레코드를 많이 삭제하는지 궁금해서 질문드립니다.
-
미해결스프링 시큐리티
다중 필터 구현 시, antMatchers 사용
예제에서는 antMatcher('/admin/**') 이런식으로특정 url 하나만 지정을 했는데혹시 '/user/**' 도 같이 Match 시키고 싶은데antMatcher 는 1개만 처리해주는 것 같습니다.꼭 새로운 FilterChain 을 생성해서 설정해야하나요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Lazy 로딩 , FetchJoin 그리고 @BatchSize
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]공부를 하면서 제가 생각하는 부분이 맞는지 확인차 질문 드립니다. 모든 XToOne 은 fetch:Lazy로 되어있다는 가정Member와 Order는 양방향 참조Member를 사용할 때 Order는 가끔 사용되는경우Lazy 로 하고 Order를 사용할 때 마다 쿼리 나감자주 사용되는 경우패치조인을 사용해서 한번에 같이 불러온다.컬렉션인 경우XToOne은 패치 조인 하고 @BatchSize를 사용해서 페이징 및 최적화 까지 챙긴다 제 생각으론 동작방법만 제대로 알고 있으면 실무에서는default_batch_fetch_size 는 계속 등록해서 글로벌로 사용하면 좋아보이는데 그게 맞나요 ?
-
미해결스프링 시큐리티
커스텀 필터 등록 시, ApplicationFilterChain 에 등록
안녕하세요 강의 잘 듣고 있습니다! SecurityConfig에서 커스텀 필터 등록 시 @Bean 형식으로 필터객체를 생성하여 등록하면 ApplicationFilterChain에 등록되는게 맞는걸까요? Bean 만 선언한다면 ApplicationFilterChain 에 등록되고addFilter(customFilter) 를 추가해주면 ApplicationFilterChain 리스트에도 등록되고SecurityFilterChain 에도 등록이 됩니다.문제는 제가 만든 커스텀 필터는, 특정 URL 에서는 동작 안하게끔 구현하고 싶은데@Bean으로 등록했기 때문에 ApplicationFilterChain에 등록되어 어떤 요청이 들어오든 동작하는 게 문제입니다. @Bean 방식이 아닌addFilter(New CustomFilter()) 로 하면 SecurityFilterChain에만 등록되긴 하는데 CustomFilter 는 스프링 컨테이너에 등록이 안되기 때문에 다른 Resource 객체들을 주입받지 못하는 상황입니다.결론은 ApplicationFilterChain에는 추가 안하고 SecurityFilterChain에만 커스텀 필터를 추가하고 싶은데 New 방식 말고는 없는 것인지가 궁금합니다!
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
Java 알고리즘 문제 풀이 02-08 컴파일 에러 문의
안녕하세요!IntelliJ로 실행해봤을 때는 이상 없는데채점사이트로 실행 시 컴파일 에러로 잡혀서 어느 부분이 문제인지 알려주시면 정말 감사합니다! import java.util.*; class Main{ public int[] solution(int n, int[] arr) { HashMap<Integer, Integer> rankMap = new HashMap<>(); ArrayList<Integer> sortList = new ArrayList<>(){{ for(int i = 0; i < n; i++) add(arr[i]); }}; int[] answer = new int[n]; sortList.sort(Collections.reverseOrder()); for (int i = 0; i < n; i++) { if (i == 0) rankMap.put(sortList.get(i), 1); else if (sortList.get(i-1).equals(sortList.get(i))) continue; else rankMap.put(sortList.get(i), i+1); } for (int i = 0; i < n; i++){ answer[i] = rankMap.get(arr[i]); } return answer; } public static void main(String[] args) { // 실행 시간 측정 // long beforeTime = System.currentTimeMillis(); // 측정 코드 시작 Main T = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) arr[i] = sc.nextInt(); for(int i : T.solution(n, arr)) System.out.print(i + " "); sc.close(); // 측정 코드 끝 // long afterTime = System.currentTimeMillis(); // long diffTime = afterTime-beforeTime; // System.out.println("실행시간(ms) " + diffTime); } }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
meberRepository 질문
위 MemberServiceTest 클래스에서 memberRepository참조변수를 beforeEach메서드에서 초기화한게 아니고 필드에서 memberRepository를 한 번 초기화 하였는데 왜 BeforeEach 실행시 이렇게 모두 다른 memberRepository 주소값이 출력되는 지 잘 모르겠습니다. 필드에서 한번만 초기화 하였고 memberRepository의 값의 변화도 없는데 모두 같은 주소값이 출력되야 하는 거 아닌가요?
-
미해결실전! 스프링 데이터 JPA
멤버, 팀 테스트 코드 NullPointerException 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]선생님과 소스는 조금씩 다르지만 문제는 없다고 보는데 도대체 왜 널포인터익셉션이 발생하는지 모르겠습니다... 테스트 코드 작성 시 teamA,teamB 저장 및 콘솔로 출력확인, db 저장도 확인[test.java]@SpringBootTest@Transactional@Rollback(false)public class MemberTest {@PersistenceContextEntityManager em;@Testpublic void testEntity(){Team teamA = Team.builder().name("teamA").build();Team teamB = Team.builder().name("teamB").build();em.persist(teamA);em.persist(teamB);System.out.println("teamA = " + teamA);System.out.println("teamB = " + teamB);Member member1 = new Member("member1", 10, teamA); // 여기서 에러 발생=========================teamA,B 객체 모두 정상 출력=>teamA = Team(id=1, name=teamA) =>teamB = Team(id=2, name=teamB)[team.java]@Entity@AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED)@Data@Builder@ToString(of = {"id", "name"})public class Team {@Id@GeneratedValue@Column(name = "team_id")private Long id;private String name;@OneToMany(mappedBy = "team")private List<Member> members = new ArrayList<>();}3.[Member.java]@Entity@Getter@AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED)@Builder@ToString(of = {"id", "username", "age"})public class Member {@Id@GeneratedValue@Column(name = "member_id")private Long id;private String username;private int age;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "team_id")private Team team;public Member(String username, int age, Team team) {this.username = username;this.age = age;if (team != null) {changeTeam(team);}}// 멤버는 팀을 변경할 수 있음// 멤버에서 변경되면 팀에 있는 멤버리스트도 변경되어야 함public void changeTeam(Team team) {this.team = team;team.getMembers().add(this);}}생성자에서 team !=null 이 아닐 때 changeTeam(team)을 호출해야 하는데 에러 로그 상 changeTeam 메소드 호출 시 "team.getMembers().add(this);" 에서 널포인터가 발생합니다...확인 부탁드립니다![에러 메세지] java.lang.NullPointerExceptionat study.datajpa.entity.Member.changeTeam(Member.java:40)at study.datajpa.entity.Member.<init>(Member.java:32)at study.datajpa.entity.MemberTest.testEntity(MemberTest.java:38)