queryFactory.select(Projections.bean(GetMyCommentResponse.MyCommentInfo.class, commentEntity.id.as("commentId"), commentEntity.content.as("content"), commentEntity.likeCount.as("likeCount"), commentEntity.createDateTime.as("createDateTime"), Projections.bean( GetMyCommentResponse.MyCommentedPopUpInfo.class, postEntity.id.as("postId"), postEntity.name.as("postName"), postEntity.mainImageUrl.as("mainImageUrl"), ).as("postInfo"), // commentEntity // 엔티티도 같이 조회하면 에러가 나지 않음 )) .from(commentEntity) .join(commentEntity.post, postEntity).fetchJoin() 안녕하세요 영한님! 강의 잘 듣고 있습니다. 공부 중에 코드를 작성하다 query specified join fetching, but the owner of the fetched association was not present in the select list 이런 에러가 발생했는데, fetchjoin시 실제 질의하는 대상 Entity를 select절에 쓰지않아서 에러가 나더라구요. select절에 commentEntity를 추가하면 에러가 발생하지 않지만 이미 commentEntity의 필드들은 모두 가져왔는데, 또 조회하는게 불필요한 작업이라고 생각되어서요. 그렇다고, fetchjoin이 아닌 일반 조인을 써버리면 코멘트마다 포스트에 대해서 n+1 문제가 발생할 것이라고 생각되구요 이러한 상황에서 좋은 해결방법이 있을까요? 감사합니다
강의하신 코드랑 같고 try { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setUsername("member"); member.setAge(10); member.setTeam(team); em.persist(member); em.flush(); em.clear(); String query = "select m from Member m left join m.team t"; List<Member> result = em.createQuery(query, Member.class) .getResultList(); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } 결과 Hibernate: /* select m from Member m left join m.team t */ select m1_0.id, m1_0.age, m1_0.TEAM_ID, m1_0.username from Member m1_0 left join이 안나가네요, jpql로 join까지 썻는데 왜 안나가는걸까요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 클라이언트 요청 → DispatcherServlet → RequestMappingHandlerMapping: 어노테이션 기반의 요청 매핑을 처리하여 HandlerMethod를 반환 →수많은 어댑터중에 RequestMappingHandlerAdapter가 Support()로 확인해보니 HandlerMehtod클래스를 지원해서 HandlerMehtod클래스핸들러 사용 → 요청 처리 → . 응답 반환 근데 인터셉터는 RequestMappingHandlerAdapter로 어댑터 채택하고 RequestMappingHandlerAdapter가 Support()로 확인하는 과정 전에 호출되니 핸들러가 handler instanceof HandlerMethod 검증하는 과정이 필요하기때문에 preHandle함수에 저 로직에 넣는다고보면되나요 ?
안녕하세요. 커넥션 풀 관련 질문이 있습니다! 커넥션 풀에있는 커넥션들은 dbms와 계속 연결되어있는 상태라고 하셨습니다. 만약 커넥션풀에 커넥션이 10개일때 이 10개의 커넥션은 dbms 세션이 계속 끊기지않고 연결되어있을테고 dbms 서버가 다운되지않는 이상 세션이 계속 유지 될텐데.. temp table 같은 가상 테이블을 사용하게 되면 세션이 무조건 종료 되어야 메모리에서 가상 테이블이 소멸된다고 알고 있는데 커넥션풀을 사용하게되면 temp Table 은 소멸되지않고 계속 dbms 서버 메모리에 떠있게 되는건가요? 아니면 커넥션을 사용하고 반납하는 순간 세션이 끊기는건가요?
public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { Member member = new Member(); member.setUsername("A"); System.out.println("======================"); em.persist(member); Thread.sleep(9000); System.out.println("======================="); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } } @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false) private String username; public Member() { } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } 우선 생각 했던 결과는 현재 identity 전략이므로 em.persist() 할 경우 insert 쿼리가 DB에 바로 보내지고 DB의 Member 테이블에 값이 저장되는거를 예상했습니다. 실제 실행해 보면 ====================== Hibernate: /* insert for jpa_basic.ex1_hello_jpa.hellojpa.Member */insert into Member (name, id) values (?, default) Thread.sleep(9000) 전까지는 insert 쿼리가 콘솔에 잘 찍힙니다. 그래서 H2 콘솔에 데이터가 잘 저장이 됐는지 확인 해봤습니다. 결과는 저장이 되지 않았습니다. Thread.sleep(9000)가 끝나고 나서야 데이터가 저장이 됩니다. 그래서 생각했던 결과인 identity 전략에서 em.persist() 할 경우 왜 DB에 바로 저장이 안되는건지 궁금합니다. 참고로 http://hibernate.hbm2ddl.auto 옵션은 create입니다. 감사합니다.
데이터 전처리 과정에서 이해되지 않는 부분이 있습니다. import pandas as pd import FinanceDataReader as fdr df_krx = fdr.StockListing('KRX') df_krx 로 데이터를 확인했습니다. ㄴ일부 컬럼 (ex.Dept)에 결측치가 있습니다. <- 값이 비어있습니다. Nan 값으로 채워진 것은 아닙니다. ㄴ이 때 info() 메소드와 df_krx.isnull()로 확인해보면 null값이 없는 것으로 나오고 isnull() 또한 모두 false가 나오는데 원인을 모르겠습니다. ㄴ이후 to_csv 메소드를 사용하여 파일을 저장한 후 저장한 파일을 읽어왔을 때는 해당 값들이 NaN 값으로 바뀌어 있는데요. 원인이 무엇일까요?
# warning 어쩌구 뜨면 쓰는건데 굳이 안써도 됨 import urllib3 urllib3.disable_warnings() # text None Type 에러 일 시 header를 추가해준다. # SSLdError 발생 시 verify옵션 추가해준다. header = { 'User-Agent' : 'Mozilla/5.0', 'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y®nm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5' } for article in articles: title = article.select_one(".title > a").text link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href'] # 상세 페이지로 요청 response = requests.get(link, headers=header, verify=False) html = response.text soup = BeautifulSoup(html, 'html.parser') # 2. 순서를 기준으로 찾기 if soup.find('span', string='발행기관'): press = soup.find('span', string='발행기관').find_next_sibling().text # find_next_sibling 옆에 있는 명령어를 찾아라 라는 명령문 else: press = [] if soup.find('span', string='발행연도'): year = soup.find('span', string='발행연도').find_next_sibling().text else: year = [] if soup.find('span', string='주제어'): keywords = soup.find('span', string='주제어').find_next_sibling().text.split(';' '') keywords_result = [] for keyword_for in keywords: keywords_result.append(keyword_for.strip()) else: keywords = [] print(title, link, press, year, keywords_result) # result = [] # for keyword in keywords: # result.append(keyword.strip())
Member.java @OneToMany @JoinColumn(name="member") private List<Order> orders = new ArrayList<>(); Order.java @ManyToOne @JoinColumn(name="member_id") //맵핑할 컬럼 private Member member; Member 의 joinColumn 은 member 객체 자체이고 Order의 joinColumn은 db의 컬럼 명인데 member 의 joinColumn 을 member_id, 즉 db의 컬럼명으로 또는 그냥 id 라고 하면 안되나요? 안된다면 이유도 알려주시면 감사하겠습니다!!
안녕하세요. 강의를 듣던중에 예외처리부분에 대해서 헷갈려서 다음장 예외처리 부분의 강의를 미리 보면서 구글링도 하면서 아래와 같이 정리해보았는데, 이렇게 이해하면 될까요? 0. throw = 예외를 던진다 = 예외를 발생시킨다. throws = 예외를 호출하는쪽으로 던진다. 1. [체크예외] - 반드시 예외처리를 해야함. 메소드 안에서 throw를 통해 throw new 체크예외()를 하게되면, throw new 체크예외()를 try~catch를 통해 해결하거나, throws로 체크예외를 던져서 해당메소드를 호출하는쪽에서 예외를 처리하도록 해야한다. public void call() { throw new 체크예외(); } 이 코드에서 call메서드는 예외를 처리하거나 throws로 던지지않았다. 그래서 컴파일오류가 발생한다. 그렇기때문에 call() 옆에 throws 체크예외를 적어주거나, public void call() { try { throw new 체크예외(); } catch (MyCheckedException e) { e.printStackTrace(); // 예외 처리 로직 } } try~catch로 예외를 처리해야한다. 즉, 메소드를 실행할떄 , 메소드 내부에서 throw을 사용해서 예외를 발생시키고 싶으면, 예외를 발생시키는 코드만 단독으로 있으면 안되고 try문안에서 예외를 발생시키고 예외가 발생하면 catch를 통해 예외를 처리하는 코드랑 같이 사용하거나, throws로 해당예외를 실행시키는 메소드를 호출하는쪽에서 예외처리를 하게하도록 throws를 통해 넘겨야한다. 참고로 try~catch를 통해 해결하면 메서드를 호출하는쪽에서는 별다른 예외처리 없이 메서드를 사용할수있다. 2. [언체크예외] - 예외처리를 하지않아도됨. public void call(){ throw new 언체크예외(); } 컴파일오류가 발생하지않는다. 이코드에서 call메서드는 예외를 처리하지않아도되고, throws로 예외를 던지지않아도된다. 3. 체크예외를 처리한 후 catch 블록에서 다시 throw new 언체크예외()을 하는 것은 체크 예외를 언체크 예외로 바꿔서 언체크 예외를 발생시키기위함이다. throw new 언체크예외();는 예외를 단순히 발생시키는 것이기때문에 try~catch를 통해 해결하지않아도 되고 별도로 throws를 하지않아도 되기때문이다. 참고로 throw new 언체크예외();를 통해 언체크예외가 발생하면 프로그램이 중단된다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 캐시가 안들어와서 정적 리소스도 호출되는것같은데 어떤식으로 해결하면될까요 ? 수업듣는데 가독성을 높이고 싶어서 이런 부분을 해결하고싶습니다
수정, 삭제, 삽입 같은 경우에는 데이터 변경이라 영속성 컨텍스트의 쓰기 저장소에 보관되어 있다가 커밋 직전에 한번에 보내지는 반면 em.find()를 통해 발생하는 조회 쿼리는 find() 사용시 바로 디비에 전송이 되는건지 궁금합니다. em.find()를 통해 발생한 조회 쿼리는 트랜잭션 커밋 종료에 상관없이 디비에 바로바로 전송이 되는건지 궁금합니다.