묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 시작하는 C 프로그래밍
필수 실습문제 '*' 출력놀이 응용 부분 관련 질문
#include <stdio.h>int main(void){ for (int i = 0; i < 5; ++i){for (int j = 0; j < 5; ++j){if (i + j < 4)printf(" ");elseprintf("*");} printf("\n");}for (int i = 0; i < 5; ++i){for (int j = 0; j < 9; ++j){if (i + j < 5 || j - i > 5)printf(" ");elseprintf("*");} printf("\n");} return 0;}이런 식으로 코드를 짰는데 제가 보기엔 제 코드에 문제가 없는데 삼각형 문제에서 출력 결과가 사진과 같이 나와요 i가 4이고 j가 8일 때 왜 "*"이 아닌 " "가 출력 되는지 모르겠어요.
-
해결됨김영한의 실전 자바 - 기본편
다형성 문제풀이2번 질문합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 다형성 문제풀이2번에서 막혀서 질문을 드립니다.문제풀이2번을 하다가 막혀서 결국에는 영한님의 문제풀이 해답 강의나 코드를 보고는 이해는 가는데, 영한님의 말 중에 체득 이라는 말이 있는데, 체득이 안되는것 같습니다. 이럴 경우 어떻게 해야나요?문제 해답 강의 를 계속 보는게 나은가요? 아니면 다형성 전체 챕터 강의를 다시 보면서 공부 하는게 나은지? 다른 방법이 있는지 궁금합니다.(1번문제는 그냥 쉬워서 그런지 문제 요구사항대로 잘되던데, 2번문제에서 너무 막히니 질문 드립니다.)
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Transformations import 안됨
androidx.lifecycle 패키지에 Transformations 가 없어서 참조가 안됩니다! Unresolved reference라고 하네용..Deprecated 된것 같진 않은데 사용방법이 달라진걸까요?val userLD : LiveData<User> = ...; val userFullNameLD: LiveData<String> = userLD.map { user -> user.firstName + user.lastName }공식문서에 보니 이것처럼 먼저 생성한 LiveData나 MutableLiveData 를 참조해서 map 을 사용하는데 이런식으로 사용해야할까요?+) 그리고 transformations 를 사용하는 이유나 언제 사용해야하는지? 이해가 잘 안되는데, 예시처럼 prefix나 suffix 가 필요할 때 사용하기 좋은가요?MainActivity 에서 myViewModel.liveCounter.value = myViewModel.liveCounter.value?.plus(1) 이건 원본 데이터를 조작한게 아닌건가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
UniqueLock과 Lock의 차이점이 궁금합니다.
uniquelock은 lock_guard와 달리 std::unique_lock<std::mutex> uniqueLock(m, std::defer_lock);를 통해 명시해놓고 자신이 원하는 순간에 uniqueLock.lock 을 할 수 있다고 이해하였습니다. 일반적인 Lock과의 차이점은 자신이 원하는 순간에 lock을 거는 것은 똑같지만lock_guard와 같이 unlock과 같이 명시를 해주지 않더라도 일정 부분이 끝나게 되면 자동으로 unlock이되는 것이라고 이해해도 괜찮을까요?
-
미해결파이썬 웹 개발(Flask, SQLAlchemy 이용)
(one-to-many) admin.users.all() 시 출력화면
안녕하세요. 파이썬 class 부분이 약하다보니 헤매면서 개념을 잡아가며 진도를 빼고 있습니다. 한가지 좀 희안한 현상이 있는데요. 왜 이렇게 되는 지 모르겠습니다. 화면대로 따라가다가 잘 안되서 이런 저런 방법으로 개별 요소까지 넣었는데요.강사님과 동일한 py 파일이구요.그런데, User.query.all() 을 해보면User 의 name 으로 출력이 안되늗데요.왜 그런건가요? py 파일내 class User 이하 부분에 def repr(self): return '<User %r>' $ self.name 을 넣어줘야 할까요? 감사님 화면에는 해당 줄이 없어도 출력이 name 으로 나오던데요.
-
해결됨이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
ASC의 컨테이너에 추가한 타겟 액터 질문
이렇게 ASC 에 추가하고나서 OnDestroy() 될 때, 타겟 액터는 지우는데요.ASC의 컨테이너는 이와 관련해서 타겟 액터를 다시 뺀다던가 하는 처리를 안 해도 되는건가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
[HTTP 요청 데이터 - API 메시지 바디 - JSON] 강의 진행 중, logging.level.org.apache.coyote.http11=debug 를 입력하면 EOFException 발생 합니다
안녕하세요. 현재 섹션 2 - HTTP 요청 데이터 - API 메시지 바디 - JSON 강의를 듣고있습니다. postman을 실행하여{"username":"hello","age":20} 를 보낼 때,properties의 logging.level.org.apache.coyote.http11=debug의 여부에 따라 EOFException이 뜨거나 안뜨는 현상이 발생합니다! 그 이유와 해결방법이 궁금해서 질문 드립니다 !!! properties 에 logging.level.org.apache.coyote.http11=debug 를 입력하지 않았을 경우에는 아래처럼 정상 실행됩니다. 하지만 logging.level.org.apache.coyote.http11=debug 를 입력한 상태로, postman을 실행하면 오류가 뜹니다. 이유가 뭘까요 ?? ㅠㅠ 해결방법도 궁금합니다!
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
"문서"를 참조하고 활용하는 방법이 궁금합니다.
한글 오토메이션 개발은 아래 문서들을 제공합니다.1.ActionObject.pdf2.HwpAutomation.pdf3.ParameterSetObject.pdf 당연히 위 문서들은 개발할 때 참조하라고.. 친절하게 제공해주신 문서입니다. 그런데 문제는... 떠먹여줘도 사용방법을 모른다는 것입니다. 저는 기본적인 함수, 클래스, 파라미터의 활용법 등에 대해서는 이해하고 활용할 수 있습니다. 그런데 한/컴 회사에서 제공한 위 문서 3개는... 어떻게 활용해야 하는지 그 방법을 모르겠습니다. 현재 본 수업에서는 한/글 프로그램 내에서 '매크로 기록 /녹화' 기능을 활용하여 원하는 동작을 녹화한 뒤 해당 스크립트 코드를 파이썬 코드로 변환하여 활용하는 방법을 알려주셨으나. 알다시피 매크로 녹화기능시 작동하지 않는 액션들이 존재하고 이런 경우에는 이러한 방법으로 원하는 프로그램 코드를 획득할 수 없습니다... ㅜㅜ 이런 경우 결국 위 3개 문서를 잘 활용하여 원하는 코드를 개발할 수 밖에 없는데 ㅠㅠ 문제는 그 방법을 모르겠습니다. 결론적으로 본 온라인 강의 수업 중에 위 문서 3개를 적절히 잘 조합하여 잘 활용하는 방법을 알려주신 강의가 있다면 해당 강좌를 특정해주시면 열심히 한 번 수강을 해보고 싶습니다. ㅠㅠ 만약 본 강의에서 내용을 제공한 사실이 없다면 따로 이 방법에 대해서 온라인 강의를 판매 하실 의향은 없으신지 궁금합니다.
-
해결됨개발자를 위한 쉬운 도커
컨테이너 포트 질문
도커 컨테이너 3개 모두 포트 번호가 다 똑같던데 클라이언트가 만약에 도메인:80번포트를 요청하면 어디로 요청이 가는건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p.46 질문
#include <bits/stdc++.h> using namespace std; int n; int main() { cin >> n; int a[n]; memset(a, 0, sizeof(a)); for(int i : a){ cout << i << " "; } return 0; }여기서 선생님이 에러가 난다고 했는데, 제 컴퓨터 vscode에서는 왜 에러 안뜨고 실행이 잘 되는 이유를 알고싶습니다. 제가 리눅스 터미널에서도 실행시켜 봤는데 에러가 발생하지 않는데, 원인을 잘 모르겠습니다.
-
미해결스프링 시큐리티
커스텀 로그인 페이지를 등록할 경우 LogoutFilter의 등록 여부 질문
안녕하세요 기선님. 강의 듣다가 질문이 생겨 질문 올립니다!http.formLogin().loginPage("/singin"); 과 같이 커스텀 로그인 페이지를 등록할 경우, DefaultLoginPageGeneratingFilter는 등록되지 않는게 맞는데, 강의 3:41초화면을 보면 LogoutFilter는 등록이 되어있는 것 같습니다. (GPT에 질문했을 때에도, LogoutFilter의 등록 여부와는 관련이 없다고 나옵니다.)이부분 확인 부탁드리겠습니다.혹시 이후 강의에서 이 부분을 정정해주셨다면, 죄송합니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
다운로드 소스 어디서 받나욥
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결Do it! Node.js 프로그래밍 입문
관리자 로그인 쪽 작업하고 있는 무한루프에 빠져 오픈이 안됩니다.
오류가 뜨지 않고 무한루프에 걸려 있는데 , admin 을 post 로 호출하는 페이지 뿐만 아니라 모든 페이지가 로딩 자체가 안되는데 혹시 무슨 문제가 있는걸까요app. js 에서 아래 코드를 주석 처리하면 다른 페이지도 바로 로딩이 됩니다.app.use(cookieParser);
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원등록과 회원목록 조회에 에러가 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 첫번째 회원 등록은 진행이 됩니다하지만 두번째 회원등록시 아래의 에러가 나옵니다.Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Sat Jan 20 16:38:38 KST 2024There was an unexpected error (type=Internal Server Error, status=500). 또한 첫번째 회원 등록 후 회원 목록에 들어가면1 은 나오지만 이름이 나오지 않습니다.구글 드라이브 첨부하오니 도움 부탁드립니다.https://drive.google.com/file/d/1itvcNmlya5m5Fr9h8-i0_5RjSUC9MCXX/view?usp=sharing
-
미해결개발자를 위한 쉬운 도커
맥에서는 도커를 어떻게 사용하는건가요?
맥에서 iterm에 접속하고 docker -version을 치면 docker server의 os가 linux로 나와있어서 그때부터 의문점이 생겨 질문드립니다. 도커가 리눅스 커널(Namespace, Cgroups)를 활용하여 컨테이너를 만들고 관리하는 것 같습니다. 그런데 맥에서는 어떻게 이게 가능한건지 궁금합니다. 제 예상으로는 도커 데스크탑이 어떤 기술에 의해 리눅스명령을 도커에 실행하면 도커가 명령을 받고 필요한 시스템 콜을 요청할때 도커 데스크탑이 맥 os가 알아들을 수 있게 변환작업을 하는 것같은데 맞는 걸까요?
-
해결됨AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)
AWS Security Groups 접근시에 AuthFailure 에러가 발생합니다
강사님의 강의를 들으면서 모든 과정 에러없이 다 따라서 진행하였습니다. 완강을 하고 기존에 제가 따로 운영하던 프로젝트를 EC2에서 ECS 배포로 변경하는 작업을 진행하였습니다.제 프로젝트에 ECS 배포와 Github Action 등이 정상적으로 적용된것을 확인하고 강의에서 진행하셨던 리소스들(express-ecs.com)에 대한 cluster, loadbalancer, task definition 등을 삭제하였습니다. 또한, IAM 롤에 대해서도 삭제를 하였는데 해당 리소스들을 삭제한 직후에 발생한 에러인지는 정확히 파악을 못 하였으나 그 이후로 갑자기 제가 자체적으로 만든(newdok) 로드밸런서의 Listener, Security Group에 대해서 접근 에러가 발생하였습니다. 여기까지가 현재 발생한 문제점이고 해당 내용들에 대한 2가지 질문이 있습니다.질문 1위 사진들을 보시면 AuthFail 에러가 발생하는데 여러 해결법들을 검색해보고 액세스 키도 새로 발급해보고 IAM 권한도 admin으로 설정해보고 여러 시도를 하였으나 해결을 하지 못하였습니다. 문제는 아무 서버와도 연결되지 않은 깡통 로드밸런서(test-lb)을 생성하여 리스너와 보안그룹을 지정해주면 해당 로드밸런서에 대해서는 AuthFail에러가 발생하지 않습니다. 만약, AWS 인증 문제라면 제가 관리하고 있는 모든 자원에 대해서 Security Group 접근 에러가 발생해야 하는데 해당 로드밸런서(newdok-lb)에 대해서만 에러가 발생하는 이유를 잘 모르겠습니다. 질문 2두 번째 질문은 ECS Task Container의 Health Check에 대해서입니다. 첫 번째 질문에서 언급했던 에러가 발생함에도 로드 밸런서 접속(HTTP만), 연결한 도메인에 대한 접속(HTTP, HTTPS)은 정상적으로 되고 있는 상황입니다. 실제로도 ECS Cluster에 들어가보면 cluster, service, 심지어 task까지 정상적으로 작동 및 Health 상태를 반환합니다.하지만, 마지막 사진을 보시면 Task을 들어갔을때, Container에서 Healthy가 아니라 Unknown 상태를 반환합니다. Unhealthy가 아니라 Unknown 반환의 경우 어떤 문제일까요?
-
미해결홍정모의 따라하며 배우는 C언어
매개구조체 포인터?없이 이중포인터로 원래 구조체접근
안녕하세요 이 글은 제가 오개념을 가지고 그냥 운좋게 실행되는 코드를 짜낸것인지 좀 불안한 마음이 역력해서 드리는 질문글입니다. 10:51 부분이며 교수님께서 짜신 read_books2함수는 (포인터가 널인지 아닌지 체크하는 유효성 검사 코드 같은 것들은 생략했습니다)void read_books2(const char* filename, struct book** books_dptr, int* n_ptr) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n_ptr); struct book* books = (struct book*)calloc(*n_ptr, sizeof(struct book)); for (int i = 0; i < *n_ptr; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", books[i].name, books[i].author); } fclose(fp); *books_dptr = books; }이고, 제가 작성한 코드는void read_books2(const char* filename, struct book** books_dptr, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); *books_dptr = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author); } fclose(fp); }입니다. 전체코드는 맨 아래에 있습니다. 교수님께서는 함수 내부에 새로운 구조체 포인터*books를 만들어서 파일로부터 읽어들인 값들을 정리했고 그 구조체의 주소값을 *books_dptr = books를 통해 원래 main함수 안에 있던 my_books로 직접 넘겨주셨습니다. 그런데 저는 매개없이 가져온 주소에 직접 *books_dptr = (struct book*)calloc(*n, sizeof(struct book));이렇게 메모리를 조정해줬고 (교수님께서는 = 좌변에 직접 새로운 구조체 포인터를 만드셨습니다) 후에 fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author);처럼 txt파일로부터 읽은 것을 함수매개변수를 통해 가져온 주소에 직접 가서 값을 넣었습니다. 혹시 이 방식에서 우려하실 부분은 없으실까요? 감사합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <conio.h> #define SLEN 101 #define FILE_NAME "books.txt" struct book { char name[SLEN]; char author[SLEN]; }; void print_books(const struct book* books, int n); void write_books(const char* filename, const struct book* books, int n); struct book* read_books(const char* filename, int* n); void read_books2(const char* filename, struct book** books_dptr, int* n); int main() { int temp; int n = 3; struct book* my_books = (struct book*)malloc(sizeof(struct book) * n); if (!my_books) { printf("malloc() has failed"); exit(EXIT_FAILURE); } my_books[0] = (struct book){ "The Great Gatsby", "F. Scott Fitzgerald" }; my_books[1] = (struct book){ "Hamlet", "William Shakespeare" }; my_books[2] = (struct book){ "The Odyssey", "Homer" }; print_books(my_books, n); printf("\nWriting to a file...\n"); write_books(FILE_NAME, my_books, n); free(my_books); n = 0; printf("Done.\n"); printf("\nPress any key to read data from a file.\n\n"); temp = _getch(); read_books2(FILE_NAME, &my_books, &n); //my_books = read_books(FILE_NAME, &n); print_books(my_books, n); free(my_books); n = 0; return 0; } void print_books(const struct book* books, int n) { for (int i = 0; i < n; ++i) { printf("Book %d : \"%s\" written by \"%s\"\n", i + 1, books[i].name, books[i].author); } } void write_books(const char* filename, const struct book* books, int n) { FILE* fp = fopen(filename, "w"); fprintf(fp, "%d\n", n); for (int i = 0; i < n; ++i) { fprintf(fp, "%s\n%s\n", books[i].name, books[i].author); } fclose(fp); } struct book* read_books(const char* filename, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); struct book* lits = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", lits[i].name, lits[i].author); } fclose(fp); return lits; } void read_books2(const char* filename, struct book** books_dptr, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); *books_dptr = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author); } fclose(fp); }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
(정보) mac homebrew h2 데이터베이스 설치하는 법
1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요../h2.sh: line 3: 6284 Trace/BPT trap: 5 java -cp "$dir/h2-2.2.224.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"위와 같은 에러가 뜨시는 분,homebrew 삭제하거나 jdk 다시 설치하지 않고h2 데이터베이스를 설치하는 방법이 있습니다. Homebrew 가 설치되어 있다면 이 방법을 사용할 수 있습니다.> brew install h2 > h2 -web이 방법으로 h2 데이터베이스를 설치하고 web url을 얻을 수 있습니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
템플릿 코드에서 if cur_v not in costs: 부분에 의문이 있습니다.
def dijkstra(graph, start, final): # 각 노드들의 비용을 저장 costs = {} # 우선순위 큐 pq = [] # (해당위치까지 가는 총 비용, 노드위치) heapq.heappush(pq, (0, start)) while pq: # heappop을 하면 가장 작은 원소가 튀어 나온다. cur_cost, cur_v = heapq.heappop(pq) # 방문하지 않은 백터 일때만 작동 if cur_v not in costs: # costs[cur_v] = cur_cost for cost, next_v in graph[cur_v]: next_cost = cur_cost + cost heapq.heappush(pq, (next_cost, next_v)) return costs[final]해당 템플릿 코드중에서 if cur_v not in costs: costs[cur_v] = cur_cost어떻게 costs에 cur_v가 없다는 것 만으로 바로 최적의 경로라고 확신할 수 있는지 의문이 있습니다. heapq의 성질덕에 cur_cost, cur_v가 '지금까지 heap에 넣은 값들중에' 가장 작은 값 인거는 알겠는데 다른 경로를 통해 뒤늦게 heap에 들어간 값이 이전에 costs에 not in이여서 넣은 값보다 작은 경우도 있지 않나요??뭔가 제 생각에 자연스럽지 않아서 다른 코드들을 찾아보니 아래와 같이 제가 생각한 조건대로 대소 비교를 해보고 넣더군요.def dijkstra(graph,start,end): costs = {vertex:111111 for vertex in graph} pq = [] heapq.heappush(pq,(0,start)) while pq: cur_cost, cur_v = heapq.heappop(pq) if costs[cur_v] < cur_cost: continue for cost, next_v in graph[cur_v]: next_cost = cur_cost + cost if next_cost < costs[next_v]: costs[next_v] = next_cost heapq.heappush(pq, (next_cost, next_v)) return costs[end] " '지금까지 heap에 넣은 값들중에' 가장 작은 값 " 이 아니라 앞으로 나올 값 중에 가장 작은 근거가 있을까요??- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
GenerationType.IDENTITY Null값 허용 안 되는 에러
안녕하세요. 기본 키 맵핑에서 GenerationType.IDENTITY 관련 부분 질문드립니다.GenerationType.IDENTITY는 PK를 입력하지 않아도 auto increment라고 해서 저절로 생성되는 거 아닌가요?그런데 이런 에러가 떴습니다.ERROR: NULL not allowed for column "ID"; SQL statement:답변 부탁드리겠습니다. 감사합니다!package hellojpa; import javax.persistence.*; @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String username; public Member() { // 기본 생성자가 하나 있어야 함 } 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; } }package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.transaction.Transaction; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // EntityManagerFactory는 application 로딩 시점에 딱 하나만 만들어놔야 한다. // Transaction 단위로 EntityManager를 만든다. EntityManager em = emf.createEntityManager(); // 쉽게 생각하면 데이터베이스 connection을 하나 받았다고 생각할 수 있음. EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Member member = new Member(); member.setUsername("Opeahchsdf"); em.persist(member); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); // 끝나면 반드시 닫아줘야 함 } emf.close(); } }<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello"> <properties> <!-- 필수 속성 --> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="javax.persistence.jdbc.user" value="sa"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence>