묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C언어
realloc() 함수에 대한 질문...
ptr2 = (int*)realloc(ptr, n * sizeof(int)); 부분에서 ptr2에 새롭게 할당된 메모리의 대표 주소가 리턴되는것은 이해햇습니다만, 그럼 원래 ptr이 가리키고 있던 메모리는 어떻게 되는 건가요?? 그냥 남아있는건지 궁금합니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
23년 1회 포인터 문제
슬라이드가 아스키코드라고 되어있어서 긴가민가하다가 질문남깁니다!*p=null p=a ; 여기부분이 포인터 변수 p가 null값이고p는 a값이라 서로 다른 변수라 봐야하나요? 저는 printf("%s\n" p) 이 부분을 보고나서p는 포인터변수로 선언하고 a를 넣어줬는데 그럼 배열 a의 맨 처음 인덱스가 들어와서 A만 출력되는 거 아닌가? 어 근데 %s면 문자열인데..하다가 슬라이드명이 ascii코드라서 거기에 사로잡혀서 A는 65니까 문자열로 못쓸거라 판단하고 여기서부턴 포인터 p랑 p랑 아예 달라서 그냥 Art를 문자열로 전부 출력하라는 말이구나 하고 다시 풀긴했거든요. 근데 답은 맞았어도 과정이 이게 맞나 싶어서요.기출에 포인터랑 아스키코드랑 막 섞어서 출제됐던 적이 있었던 기억이 나서 문제풀 때 이런 부분들이 자꾸 헷갈리네요 ㅠ
-
미해결선형대수학개론
수치해석 강의도 출시 예정인가요?
제작 예정 여부와 일정을 알고 싶습니다!
-
미해결스프링 핵심 원리 - 기본편
Map, List 조회시 빈등록 여부 질문합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용][조회한 빈 모두 필요할 때 , List, Map] 강의를 보고 스프링 빈에 등록되는 것을 모든 빈이 궁금하여 조회해 보았습니다. 그런데 @Autowire를 통해 Map policyMap, List policies은 빈 에는 등록 되지 않아 보입니다.그 이유가 AutoConfig.class를 통하여 @Componet가 설정된 클래스와 명시적으로 설정한DiscountService.class가 빈으로 등록 되고 Map policyMap, List policies은 @Componet설정이 된것이 아닌 스프링이 제공하는 기능으로 의존 관계 설정만 되는 것이 맞나요?코드package hello.core.autowired; import hello.core.AutoAppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; public class AllBeanTest { @Test void test(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames){ BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){ System.out.println("beanDefinitionName = " + beanDefinitionName + " / beanDefinition = " + beanDefinition.getBeanClassName()); } } } static class DiscountService { // 해당 타입(DiscountPolicy)에 일치하는 모든 빈이 컬렉션에 자동 추가 된다. -> 스프링이 제공하는 기능 // List에는 해당 타입의 빈이 순서대로 들어 간다. // Map에는 빈 이름을 키로, 빈 객체 값을 가지게 된다. private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(List<DiscountPolicy> policies, Map<String, DiscountPolicy> policyMap) { this.policies = policies; this.policyMap = policyMap; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } } }
-
미해결
flyway가 지정된 데이터베이스에 접근 불가
스프링부트에서 flyway 데이터베이스 마이그레이션 강의를 보고 있습니다. 옛날 강의라서 강사님은 2.4.5 버전과 flyway 7.x버전을 사용하셨습니다. 일단은 저도 flyway 10.x버전을 사용하려다가 db에 연결이 안되서 7.x버전을 사용하니 성공하여 진도를 나갔습니다. 하지만 test코드 만드는 과정에서 호환문제로 결국 또 막혀서 9.8.1버전을 사용하여 다시하고 있습니다.build.gradle입니다.plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' id 'org.flywaydb.flyway' version '9.8.1' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.flywaydb:flyway-core:9.8.1' //runtimeOnly 'com.h2database:h2' implementation 'mysql:mysql-connector-java:8.0.32' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } flyway { url = 'jdbc:mysql://localhost:3306/db_example' user = 'sa' password = 'password' locations = ['classpath:db/migration'] baselineOnMigrate = true }properties입니다.spring.application.name=bookstore spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example spring.datasource.username=sa spring.datasource.password=password spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true spring.flyway.locations=classpath:db/migrationmain->resources->db->migration디렉토리에V1__create_books.sql 파일을 만들었습니다.CREATE TABLE books( id BIGINT NOT NULL, name VARCHAR(64), author VARCHAR(64) );db도 문제 없습니다.7.x버전으로 했을 때 인텔리제이 터미널에서 ./gradlew flywayMigration 해서 테이블을 만드는 것까지 성공했습니다... 스프링부트3.3.2에 맞는 flyway버전을 사용했더니계속 실패합니다. 분명 url경로도 맞게 했고 틀린부분이 없을텐데 왜 이럴까요. 디펜던시도implementation 'org.flywaydb:flyway-core:9.8.1'implementation 'org.flywaydb:flyway-mysql:9.8.1'이렇게 바꿔보고 여러짓을 해봤지만 ./gradlew flywayMigration 성공못하고 있습니다..flyway 9.버전일 때 ./gradlew flywayClean성공하고 ./gradlew flywayMigration실패했는데, db_example을 지우고 다시 생성해서 해보니 ./gradlew flywayClean도 이제 실패합니다.PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew flywayClean > Task :flywayClean FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flywayClean'. > Error occurred while executing flywayClean No database found to handle jdbc:mysql://localhost:3306/db_example * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 1s 1 actionable task: 1 executed PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew flywayMigrate > Task :flywayMigrate FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flywayMigrate'. > Error occurred while executing flywayMigrate No database found to handle jdbc:mysql://localhost:3306/db_example * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 1s 1 actionable task: 1 executed PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\제로베이스\springlecture\bookstore> 이것들은 성공하네요..PS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew clean BUILD SUCCESSFUL in 1s1 actionable task: 1 executedPS C:\Users\user\OneDrive\Desktop~1-HyunjunLee-56359672\여기 경로 개인사정으로 지웠습니다.\springlecture\bookstore> ./gradlew build BUILD SUCCESSFUL in 3s7 actionable tasks: 7 executed
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
리사이클러뷰 오류 해결 방법이 궁금합니다.
개발자님 안녕하세요. 안드로이드 커뮤니티 앱 만들기 섹션 4 팁 페이지 만들기 중 컨텐츠 리스트 만들기를 공부하고 있습니다. 공부하던 중 리사이클러뷰에 오류가 있어서 질문 남깁니다. 오류는 화면에 그리드의 개수만큼만 아이템이 뜹니다. 아이템을 4개를 넣어 놓았을 때, 그리드의 개수가 2개면 아이템 2개만, 그리드 개수가 3개면 아이템 3개만, 4개면 4개만 화면에 뜹니다. 그리드 개수가 5개면 4개만 뜹니다. 관련 코드 아래에 작성해 놓겠습니다. 검토해주시면 정말 감사하겠습니다. 혹시 전체 코드가 필요할 시 바로 구글드라이브로 전달해드리겠습니다!! 매번 감사드립니다.-ContentsListActivitypackage com.example.mysolelife.contentsList import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.mysolelife.R class ContentsListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_contents_list) val rv : RecyclerView = findViewById(R.id.rv) val items = ArrayList<ContentsModel>() items.add(ContentsModel("imageUrl1", "title1")) items.add(ContentsModel("imageUrl2", "title2")) items.add(ContentsModel("imageUrl3", "title3")) items.add(ContentsModel("imageUrl4", "title4")) val rvAdapter = ContentsRVAdapter(items) rv.adapter = rvAdapter rv.layoutManager = GridLayoutManager(this, 2) } }-ContentsModeldata class ContentsModel ( var title: String = "", val imageUrl : String = "" )-ContentsRVAdapterclass ContentsRVAdapter(val items : ArrayList<ContentsModel>) : RecyclerView.Adapter<ContentsRVAdapter.Viewholder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentsRVAdapter.Viewholder { val v = LayoutInflater.from(parent.context).inflate(R.layout.contents_rv_items, parent, false) return Viewholder(v) } override fun onBindViewHolder(holder: ContentsRVAdapter.Viewholder, position: Int) { holder.bindItems(items[position]) } override fun getItemCount(): Int { return items.size } inner class Viewholder(itemView : View) : RecyclerView.ViewHolder(itemView) { fun bindItems(item : ContentsModel){ val contentTitle = itemView.findViewById<TextView>(R.id.textarea) contentTitle.text = item.title } } }-activity_contents_list.xml<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".contentsList.ContentsListActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="카테고리 영역 텍스트" android:textSize="20sp" android:textStyle="bold" android:layout_marginTop="20dp" android:textColor="@color/black" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="80dp"/> </androidx.constraintlayout.widget.ConstraintLayout>-contents_rv_items<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".contentsList.ContentsListActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="카테고리 영역 텍스트" android:textSize="20sp" android:textStyle="bold" android:layout_marginTop="20dp" android:textColor="@color/black" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="80dp"/> </androidx.constraintlayout.widget.ConstraintLayout>
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
상속
class Parent{}class Child extends Parent{}void main① Parent.a = Child()② Child.b = Child()위 식에서 ① ② 두 문장의 차이가 궁금합니다.둘다 = Child()기 때문에 본인들이 태어날때 부모 기본자도 실행할 것이고, 만약 a나 b에 없는 메소드를 실행시킨다면 부모 클래스를 찾아가는 것도 같은데둘에 무슨 차이가 있는지 모르겠습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
1-2. BigQuery환경 설정 오류
강의 내용을 똑같이 따라했는데 'basic.pokemon'에서 오류가 떠요ㅠㅠ 제가 놓친게 있을까요?
-
해결됨Godot Engine 으로 시작하는 첫 게임 개발
컵케이크 지나갈때 점수표시가 안됩니다ㅠㅠ
func onbody_entered(body): if body.name == "자동차": print("자동차와 충돌함!")그대로 입력했는데 출력이 안되네요 ㅠㅠ 다른 씬들도 다 검토해봤는데 똑같습니다 뭐가 문제일까요
-
미해결김영한의 실전 자바 - 기본편
2분 22초쯤에 질문이있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.2분 22초 에 선생님이 하신 말씀이 예를들어 X002.method 가 호출되면 힙영역의 인스턴스에서 메서드영역에있는 메서드를 호출하고 스택영역에 메서드 호출정보들이 저장된다 라고 이해해도 되나요?
-
미해결홍정모의 따라하며 배우는 C언어
ilk파일이 없습니다.
위의 사진은 선생님 화면으로 Solution 폴더>debug폴더 내에 exe, ilk, pdb파일이 있습니다.위의 사진은 제 컴퓨터 화면으로 ilk파일이 없는 것을 확인했습니다. 실행에는 문제가 없는데 크게 중요하지 않은 부분인가요??visual studio 2022버전을 사용하고있는데 설정이 잘못된걸까요??
-
미해결김영한의 실전 자바 - 중급 2편
hashCode를 오버라이딩 했을때 반환하는게 틀려요.
@Override public int hashCode() { return Objects.hashCode(id); }이걸로 ide가 만들어주네요. 업데이트 된 건가요?해쉬코드가 다르게 나와서 다른 인덱스에 채워지네요.강의처럼 아래와 같이 하면,@Override public int hashCode() { return Objects.hash(id); }강의와 똑같이 같은 인덱스에 채워집니다.Objects의 hash 메서드와 hashCode 메서드의 차이가 무엇일까요? 왜 인텔리제이는 hashCode 메서드를 생성했을까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
ArrayEx2 질문 입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.ublic class ArryaEx2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] number = new int[5]; System.out.println("5개의 정수를 입력하세요:"); for (int i = 0; i < number.length; i++) { int input = scanner.nextInt(); number[i] = input; } System.out.println("출력"); for (int i = 0; i < number.length; i++) { System.out.print(number[i]); if(i < number.length -1) { System.out.print(","); } }이렇게 하면 정상작동 하는데ublic class ArryaEx2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int input = scanner.nextInt(); int[] number = new int[5]; System.out.println("5개의 정수를 입력하세요:"); for (int i = 0; i < number.length; i++) { number[i] = input; } System.out.println("출력"); for (int i = 0; i < number.length; i++) { System.out.print(number[i]); if(i < number.length -1) { System.out.print(","); } }int input = scanner.nextInt() 이걸 for 문 밖에 입력하면 정상 작동을 하지 않습니다.해당 위치는 스코프를 모두 적용할수 있는 위치인데 왜 그런거죠?
-
해결됨삼각형의 실전! CMake 초급
CMake 출시 연도가 영상에서 아마도 잘못 소개된 것 같습니다
안녕하세요.좋은 강의를 만들어주셔서 감사합니다! <CMake 소개> 영상 내용 중 CMake 출시 연도와 관련하여 잘못된 정보가 있는 것 같아 글을 남깁니다.<CMake 소개> 영상의 0:25 부근입니다.아래 슬라이드와 함께 나오는 부분입니다.위 슬라이드에는 "2013년 10월 처음 공개(v2.8.12)"라고 나오고,영상 0:25 부분에서는 삼각형님이 "CMake는 2013년에 처음 출시가 되었습니다"라고 설명하시는 음성이 나옵니다. 위 내용대로 2013년에 CMake가 처음 출시 되었다면 올해가 2024년이니 11년 정도의 역사를 가진 프로그램이라는 의미입니다. 슬라이드 상의 "20+년차 프로그램"이라는 내용과 맞지 않습니다. 인터넷 검색을 해보니 CMake가 처음 공개된 연도는 2000년으로 나옵니다.https://en.wikipedia.org/wiki/CMakehttps://cmake.org/history/ 아마 영상을 찍는 과정에서 무언가 착오가 있었던 것 같습니다. (위 슬라이드에서 v2.8.12를 언급한 것은 Modern이 아닌 CMake의 마지막 버전을 말씀하시고 싶었던 것이 아닌가 추측합니다. 이 추측이 맞을까요? v2.8.12를 위 슬라이드에서 언급하신 본래 이유는 무엇일까요?) 이 부분을 한번 검토해주시고 정확한 내용을 영상에 반영해주실 수 있을까 해서 글을 남깁니다.감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
문제 풀 때 주석처리
실제 시험장에서 주석으로 제가 간단하게 알 수 있도록 설명을 적어두고 문제를 풀 경우 제출할 때에는 주석을 다 지워줘야될까요? 길이가 길어지니까요? 아니면 그정도는 별로 영향이 안미칠까요?예를 들면http://boj.kr/ec4795ae62434cbd8a776dfbada39596이러한 상황입니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
5:57에 printEven은 true지만 !printEven은 true가 아닌것(!)이라서 false라고 설명해주신건가요? 그래야 &&조건이 둘다 참이여야해서 볼 필요도 없다고 하신거겠죠..?
질문은 동영상 강의에서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그렇게 해주셔야어떤 강좌에서 질문하셨는지 알 수 있습니다.영상에서 몇 분 몇 초 대를 알려주셔야 한 번에 확인이 가능합니다.이미 다른 누군가가 질문을 한 이력이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다.질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
설치 오류
수정 하는 부분에서 초록색으로 뜨고 수정이 안됩니다.아무리 해도 해당 내용들이 수정이 안되요.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
강의 자료 파일을 열 수 없습니다.
윈도우 사용자입니다. 첨부파일을 다운로드 받았는데, 압축파일 풀기를 하면 아래와 같이 오류 메시지가 나오는데요. 어떻게 해결하면 좋을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관 관계 저장 시 궁금한 점.
영한님 안녕하세요. 강의를 잘 듣고 있습니다!학습 중 궁금한 점이 있어 질문 드립니다.엔티티를 저장할 때에는 연관된 엔티티가 모두 영속 상태여야 한다고 알고 있습니다. 다음 코드에서 현재 user와 연관된 teamB는 영속 상태가 아닙니다. 따라서 실행 시 에러가 발생할 것으로 예상했습니다. 그러나 에러 없이 잘 동작하였고, DB를 확인해 보니 user의 team이 현재 연관된 teamB가 아니라 teamA로 되어 있었습니다.@Entity @Table(name="users") public class User { @Id @GeneratedValue @Column(name="user_id") private Long id; private String username; @ManyToOne @JoinColumn(name="team_id") private Team team; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } }@Entity public class Team { @Id @GeneratedValue @Column(name="team_id") private Long id; private String teamName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTeamName() { return teamName; } public void setTeamName(String teamName) { this.teamName = teamName; } }public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team teamA = new Team(); teamA.setTeamName("teamA"); System.out.println(" =====[1]===== "); System.out.println("teamA = " + teamA); System.out.println("teamA.getId() = " + teamA.getId()); System.out.println("teamA.getTeamName() = " + teamA.getTeamName()); System.out.println(" 영속? = " + em.contains(teamA)); System.out.println(" ============= "); System.out.println(); em.persist(teamA); System.out.println(" =====[2]===== "); System.out.println("teamA = " + teamA); System.out.println("teamA.getId() = " + teamA.getId()); System.out.println("teamA.getTeamName() = " + teamA.getTeamName()); System.out.println(" 영속? = " + em.contains(teamA)); System.out.println(" ============= "); System.out.println(); Team findMyTeam = em.find(Team.class, teamA.getId()); System.out.println(" =====[3]===== "); System.out.println("findMyTeam = " + findMyTeam); System.out.println("findMyTeam.getId() = " + findMyTeam.getId()); System.out.println("findMyTeam.getTeamName() = " + findMyTeam.getTeamName()); System.out.println(" 영속? = " + em.contains(findMyTeam)); System.out.println(" ============= "); System.out.println(); Team teamB = new Team(); teamB.setId(findMyTeam.getId()); teamB.setTeamName("teamB"); System.out.println(" =====[4]===== "); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); User user = new User(); user.setUsername("username"); user.setTeam(teamB); System.out.println(" =====[5]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); em.persist(user); System.out.println(" =====[6]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); tx.commit(); System.out.println(" =====[7]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ em.close(); } emf.close(); } =====[1]===== teamA = hellojpa.Team@fa5f81c teamA.getId() = null teamA.getTeamName() = teamA 영속? = false ============= =====[2]===== teamA = hellojpa.Team@fa5f81c teamA.getId() = 1 teamA.getTeamName() = teamA 영속? = true ============= =====[3]===== findMyTeam = hellojpa.Team@fa5f81c findMyTeam.getId() = 1 findMyTeam.getTeamName() = teamA 영속? = true ============= =====[4]===== teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[5]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[6]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[7]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= 궁금한 점은 다음과 같습니다:1. teamB가 영속 상태가 아닌데 어떻게 user가 저장될 수 있었는지 궁금합니다.2. user는 현재 teamB와 연관되어 있는데, 왜 DB에는 teamA가 나오는지 궁금합니다.좋은 강의 감사합니다!!
-
미해결김영한의 실전 자바 - 중급 1편
타입 안전 열거형 패턴 질문 입니다.
package enumeraion.ref1; public class ClassGrade { public static final ClassGrade BASIC = new ClassGrade(10); public static final ClassGrade GOLD = new ClassGrade(20); public static final ClassGrade DIAMOND = new ClassGrade(30); private final int discountPercent; private ClassGrade(int discountPercent) { this.discountPercent = discountPercent; } public int getDiscountPercent() { return this.discountPercent; } }문득 궁금한게 저런식으로 자기 자신을 호출 하면 이제 다시 각각의 필드에 인스턴스가 생성될텐데 그럼 그 인스턴스가 무한으로 인스턴스를 생성하지는 않는건지 갑자기 그부분이 헷갈려 질문 드립니다.정적필드가 아닐경우에는 더욱이 인스턴스가 생성됨가 동시에 각각의 멤버변수의 인스턴스가 또 인스턴스를 생성하는 형태는 아닌지 궁금합니다.