게시글
질문&답변
@RequestMapping 질문드립니다.
안녕하세요저도 궁금해서 찾아보니 아래와 같이 JSP는 GET, POST, HEAD에 대해서만 허용된다는 것을 알 수 있었습니다. 중단점을 찍어서 추적해보니 "JSPServlet" 클래스에서 아래와 같은 오류를 발생시키고 있었습니다. Method Not Allowed HTTP Status 405 - JSPs only permit GET POST or HEAD오류를 검색해보니 다음과 같은 링크를 발견할 수 있었습니다.https://stackoverflow.com/questions/23886941/http-status-405-jsps-only-permit-get-post-or-head 정리하자면, Controller에서 모든 메서드의 요청이 받아지는 것이 맞지만 JSP 페이지를 렌더링하는 과정에서 Method를 검사하고 오류를 반환하는 것입니다. 감사합니다.
- 0
- 2
- 385
질문&답변
em.detach 메서드와 관련하여 질문드립니다.
안녕하세요저도 궁금해서 직접 테스트 해보니 insert문이 사라지는 건 아니었습니다.(사진)위와 같이 중단점을 찍고 단계별로 확인해 봤을 때1) em.persist() 이후, actionQueue(쓰기 지연 저장소)에 insert 쿼리와 persistenceContext(영속성 컨텍스트)에 entity가 저장된 것을 볼 수 있었습니다.(사진)2) em.detach() 이후, 쓰기 지연 저장소에는 여전히 insert 쿼리가 남아있으나 영속성 컨텍스트에는 entity가 없어진 것을 볼 수 있었습니다.(사진)이후 em.flush()의 동작을 추적해보니 영속성 컨텍스트 안에 관리하고 있는 엔터티의 개수를 확인하는 if문에 걸려 insert 문이 실행되지 않은 것으로 보입니다.(사진)
- 0
- 2
- 446
질문&답변
생각한대로 실행이 되지 않습니다.
안녕하세요.H2 1.4.200 버전부터는 테이블 삭제 동작이 SQL 표준을 따르도록 변경되었습니다.이전 버전에서는 테이블 삭제에 대하여 제약 조건을 무시하고 삭제하는 방식이었으나 이제는 제약 조건을 고려하지 않으면 실패하게 됩니다.Hibernate 5.3.10 버전은 이 변경에 대응되지 않은 버전이기 때문에 이슈가 발생한 것입니다.따라서 다음 두 가지 방법으로 이슈를 해결할 수 있습니다. H2 1.4.199로 H2 버전을 낮추기Hibernate의 버전을 5.4.13 이상으로 올리기 저는 강의와 맞추기 위해 H2 버전을 낮추는 방법을 추천드립니다.관련 내용으로는 아래 링크를 확인해주세요https://hibernate.atlassian.net/browse/HHH-13711
- 0
- 3
- 337
질문&답변
실전 예제 1 - 요구사항 분석과 기본 매핑 질문있습니다.
안녕하세요1번 질문에 대해서 이미 충분한 답변해주셨으나 제 경험을 조금 말씀드리자면객체는 여러 메소드를 거쳐서 사용되는 경우가 많은데, Setter와 같이 객체의 상태를 변경하는 메소드가 열려있으면 어디서 이 객체가 변경되었는지 추적하기가 어려워, 유지보수가 힘들어졌던 경우가 있었습니다. 다시 말하면 객체의 불변성(객체가 중간에 값이 바뀌지는 않았는지)이 보장되지 않아 어려움을 겪었었습니다.복잡한 시스템에서 내가 오래전에 작성한 로직이거나, 다른 사람과 협업하여 개발한 경우에 로직 중간에 어디서든 Setter 메소드가 호출되어 값이 변할 수도 있기 때문에 객체의 상태를 예측하기가 어려워집니다. public void doSomething(Member member) { executeSomething(member); performSomething(member); processSomething(member); handleSomething(member); updateSomething(member); calculateSomething(member); generateSomething(member); // 이 시점에서 Member의 필드가 처음과 같다고 보장할 수 없습니다. } 2. IntelliJ의 코드 완성(code completion) 기능으로 ctrl + space(Command + space)로 사용하실 수 있습니다. 만약 코드 문맥에서 타입 정보까지 고려하여 보려면 ctrl + shift + space(Command + shift + space)를 사용하시면 됩니다.4. IntelliJ의 코드 접기(Code folding) 기능으로 ctrl + '-'(Commang + '-') 로 접고 ctrl + '+'(Command + '+')로 펼칠 수 있습니다. 혹은 아래와 같이 버튼으로 접었다 폈다 할 수도 있습니다.(사진)셋팅에서 아래와 같이 메소드 바디가 한 줄일 때 자동으로 접히도록 설정할 수도 있습니다.(사진)
- 0
- 3
- 202
질문&답변
:단방향 연관관계 질문있습니다.
안녕하세요.말씀하신 강의의 20분 55초에서 발생하지 않는 쿼리는 아래와 같은 멤버를 조회하는 쿼리입니다.select member0_.MEMBER_ID as MEMBER_I1_0_0_, member0_.TEAM_ID as TEAM_ID3_0_0_, member0_.USERNAME as USERNAME2_0_0_, team1_.TEAM_ID as TEAM_ID1_1_1_, team1_.TEAM_NAME as TEAM_NAM2_1_1_ from Member member0_ left outer join Team team1_ on member0_.TEAM_ID=team1_.TEAM_ID where member0_.MEMBER_ID=? 감사합니다.
- 0
- 3
- 191
질문&답변
hibernate 생성한 select 쿼리의 team_id, member_id 컬럼 중복
안녕하세요. 해당 문제에 대해서 인터넷에서 검색한 결과와 직접 중단점을 찍어가며 테스트를 수행해본 결과를 요약해서 전달드립니다. 저도 주니어 개발자로 아직 실력이 부족해, 많은 부분을 추론에 의지하여 말씀드릴 수 밖에 없는 점은 양해 부탁드립니다. 먼저 스택 오버 플로우 질문과 답변에 나온 내용으로, Hibernate 6.0 미만 버전에서는 쿼리문을 만드는 단계에서 복잡한 연관 관계가 있는 테이블인 경우에 PK, FK가 걸려있는 열을 중복해서 검색하는 쿼리문이 만들어진다는 것을 알 수 있었습니다. Hibernate 6.0 이상의 버전에서는 쿼리문을 만드는 로직이 바뀌어서 해당 현상이 더 이상 발생하지 않습니다.아래는 제가 Hibernate 6.4 버전에서 테스트 해본 결과입니다. (사진)(사진) 이 현상에 대해서 직접 테스트 해본 결과 제가 내린 결론은 다음과 같았습니다.Hibernate는 애플리케이션 실행시 @Entity가 붙은 클래스들을 순회하며 데이터베이스에서 엔티티를 로딩하기 위한 계획(Load plan)과 쿼리를 만들기 위한 정보(Query Spaces)를 만듭니다. Query Spaces를 만드는 중에 엔터티의 Column들을 돌며 Query에 사용할 별칭을 만듭니다. Hibernate의 Trace 로그를 찍어보니 아래와 같은 로그를 확인할 수 있었습니다.2023-12-22 06:01:19 DEBUG [org.hibernate.loader.plan.build.spi.LoadPlanTreePrinter] LoadPlan(entity=hellojpa.Member) - Returns - EntityReturnImpl(entity=hellojpa.Member, querySpaceUid=, path=hellojpa.Member) - EntityAttributeFetchImpl(entity=hellojpa.Team, querySpaceUid=, path=hellojpa.Member.team) - QuerySpaces - EntityQuerySpaceImpl(uid=, entity=hellojpa.Member) - SQL table alias mapping - member0_ - alias suffix - 0_ - suffixed key columns - {member_i1_0_0_} - JOIN (JoinDefinedByMetadata(team)) : -> - EntityQuerySpaceImpl(uid=, entity=hellojpa.Team) - SQL table alias mapping - team1_ - alias suffix - 1_ - suffixed key columns - {team_id1_1_1_} 2023-12-22 06:01:19 DEBUG [org.hibernate.loader.entity.plan.EntityLoader] Static select for entity hellojpa.Member [NONE]: select member0_.MEMBER_ID as member_i1_0_0_, member0_.TEAM_ID as team_id3_0_0_, member0_.USERNAME as username2_0_0_, team1_.TEAM_ID as team_id1_1_1_, team1_.name as name2_1_1_ from Member member0_ left outer join Team team1_ on member0_.TEAM_ID=team1_.TEAM_ID where member0_.MEMBER_ID=?이는 Member Entity에 대한 Load plan과 Query Spaces가 만들어졌다는 로그로 보입니다. 그런데 바로 다음 로그에서 아래와 같이 Members Collection에 대한 Load Plan과 Query Spaces가 만들어졌다는 것을 알 수 있었습니다.2023-12-22 06:01:19 DEBUG [org.hibernate.loader.plan.build.spi.LoadPlanTreePrinter] LoadPlan(collection=hellojpa.Team.members) - Returns - CollectionReturnImpl(collection=hellojpa.Team.members, querySpaceUid=, path=[hellojpa.Team.members]) - (collection element) CollectionFetchableElementEntityGraph(entity=hellojpa.Member, querySpaceUid=, path=[hellojpa.Team.members].) - QuerySpaces - CollectionQuerySpaceImpl(uid=, collection=hellojpa.Team.members) - SQL table alias mapping - members0_ - alias suffix - 0_ - suffixed key columns - {team_id3_0_0_} - entity-element alias suffix - 1_ - 1_entity-element suffixed key columns - member_i1_0_1_ - JOIN (JoinDefinedByMetadata(elements)) : -> - EntityQuerySpaceImpl(uid=, entity=hellojpa.Member) - SQL table alias mapping - members0_ - alias suffix - 1_ - suffixed key columns - {member_i1_0_1_} 2023-12-22 06:01:19 DEBUG [org.hibernate.loader.collection.plan.CollectionLoader] Static select for collection hellojpa.Team.members: select members0_.TEAM_ID as team_id3_0_0_, members0_.MEMBER_ID as member_i1_0_0_, members0_.MEMBER_ID as member_i1_0_1_, members0_.TEAM_ID as team_id3_0_1_, members0_.USERNAME as username2_0_1_ from Member members0_ where members0_.TEAM_ID=? QuerySpaces 중간에 JOIN으로 시작하는 곳을 보면, Members Collection이 Member Entity에 대한 QuerySpace 정보를 갖고 있다는 걸 알 수 있었습니다.이 정보들을 저는 아래와 같이 정리하였습니다.1. Hibernate는 Entity와, 연관 관계에 사용되는 Entity Collection에 대한 Load Plan과 Query Space를 만들고 저장한다.Collection의 Query Space는 해당 컬렉션에 저장되는 Entity의 Query Space 정보를 갖고 있다.그런데 Collection Query Space와 Entity Query Space 둘 모두가 연관 관계에 사용되는 컬럼의 키값(예제의 경우에는 team id와 member id)를 갖고 있다.Collection을 불러오면 Collection Query Space 자신이 갖고 있는 키값과 Entity Query Space가 갖고 있는 키를 모두 불러온다.이 정보를 갖고 select 문을 만드니 중복이 발생해버린다. 감사합니다.
- 0
- 2
- 416
질문&답변
parsistence.xml h2.Driver 에러
안녕하세요. 일단 해당 오류가 org.h2.Driver 클래스를 찾지 못해서 발생한 것으로 보입니다. org.h2.Driver 클래스는 com.h2databse:h2 외부 라이브러리 안에 존재합니다. intelliJ의 왼쪽 프로젝트 탭에서 External Libraries 안에 Maven: com.h2databse:h2:2.2.224가 존재하는지 확인해주세요.(사진)만약 이 라이브러리가 없다면 intelliJ 오른쪽에 Maven 탭을 열고 Download Sources를 클릭하여 다운로드 하도록 합니다. (사진)잠시 후 intelliJ 하단에 진행 상태를 보고 다운로드가 종료되면 compile을 해주세요(사진)다시 External Libraries에 라이브러리가 있는지 확인합니다.(사진)감사합니다.
- 1
- 2
- 948
질문&답변
String Key 문제점
안녕하세요.일단 원인은 String 타입 (데이터 베이스에서는 varchar 타입)의 ID를 IDENTITY 전략으로 자동 생성할 수 없기 때문입니다. (에러 메세지 중 Feature not supported: "CHARACTER VARYING(255)" -> 기능이 varchar(255)를 지원하지 않는다는 뜻입니다.)1. 하이버네이트의 버전 문제는 아닌 것 같습니다.2. 로그에서 create 쿼리가 찍혔다고 해서 해당 쿼리가 정상적으로 수행됐다는 것을 의미하지는 않습니다. 쿼리를 데이터베이스에 전달했으나 데이터베이스가 정상적으로 수행하지 못하고 오류를 뱉었습니다. 제가 1.4.199, 1.4.200, 2.2.244 세가지 버전의 h2 데이터베이스로 테스트 해보니..1.4.199, 1.4.200 버전의 h2 데이터베이스에서는 데이터 타입이 String(varchar)이어도 IDENTITY 전략으로 ID를 자동 생성할 수 있었습니다. 반면 2.2.244 버전의 h2 데이터베이스에서는 데이터 타입을 반드시 int와 같은 숫자형으로만 자동 생성할 수 있었습니다. 제 생각에는 문자형의 데이터 타입이 자동으로 증가되는 것이 부적절하다고 판단하여 2 버전부터는 숫자형 데이터 타입으로만 IDENTITY 조건을 걸 수 있도록 한 것 같습니다. h2database.com이나 github에서 관련 내용을 찾아보려고 했는데 못 찾겠네요.+인프런에 동일한 질문이 있었기에 남겨드립니다.https://www.inflearn.com/questions/382601/generatedvalue-%EC%82%AC%EC%9A%A9-%ED%9B%84-ddl-%EC%8B%A4%ED%8C%A8
- 1
- 1
- 566
질문&답변
editForm에러 ㅠㅠ
안녕하세요혹시 build 된 결과 경로(아마 ./out/production 디렉토리 아래)에 editForm.html가 없나요?(사진)editForm.html이 없다면 main 모듈을 오른쪽 클릭하고 Rebuild를 수행해보세요.(사진)이후 editForm.html이 생성되었는지 확인하셔서, 생성되었다면 성공입니다.(사진)감사합니다.
- 0
- 2
- 558
질문&답변
로그가 안떠요
안녕하세요.공유해주신 코드를 살펴보니 test 패키지 밑에 application.yml이 별도로 존재하여 발생하는 문제였습니다.(사진)@SpringBootTest가 test 패키지 밑의 application.yml을 먼저 적용하기 때문에 main 패키지의 설정 파일을 수정하여도 반영되지 않았던 것으로 보입니다.해당 파일을 삭제하거나 아래와 같이 수정하시면 로그를 확인하실 수 있으실 겁니다.(사진)*추가적으로 연결 정보(datasource 값들인 url, username, password, driver 등)가 없으면 기본 값으로 인 메모리 모드로 실행이 됩니다. 따라서 h2 database에 직접 데이터가 저장되는 것을 보기 위해서는 datasource 값들을 입력해주셔야 됩니다.
- 1
- 2
- 494