안녕하세요 강의 정말 잘 듣고 실무에서도 열심히 사용하고 있습니다. 강의에서 lazy loading과 fetch join을 활용하여 최적화 하는 부분에 대해서는 이해를 하고 있습니다. 그렇다면 eager loading은 사용을 피해야하는 걸까요? 아니면 어떤 케이스에 대해서는 즉시 로딩이 더 실무적으로 유용한 경우가 있을까요? 즉시 로딩이 사용을 지양해야 된다면 JPA에서 굳이 만들지 않았을 것 같은데 어떤 상황에서 사용해야할지에 대해 의문점이 듭니다. 제가 생각했을 땐 테이블 분리를 위해 엔티티를 나누었지만 항상 같이 조회되는 상황이나 OneToOne 상황에서는 크게 상관없을 것 같긴한데 필요없는 컬럼까지 즉시 로딩으로 가져오는게 성능에 크게 영향을 끼치는지에 대해 궁금합니다. 이외에도 실무적으로 이럴 땐 지연 로딩보단 즉시 로딩이 더 적합하다라는 상황이 있다면 조언 부탁드리겠습니다. 감사합니다!
select h.hacker_id, h.name from Submissions s inner join Hackers h on s.hacker_id = h.hacker_id inner join Challenges c on s.challenge_id = c.challenge_id inner join Difficulty d on c.difficulty_level = d.difficulty_level where d.score = s.score group by h.hacker_id having count(h.hacker_id) > 1 order by count(h.hacker_id) desc, h.hacker_id 제가 푼 답안인데 틀렸다고 나옵니다. group by h.hacker_id, h.name 2개를 해줘야 정답으로 나오는데 hacker_id만 그룹화 해서 묶어도 되는거 아닌가요? select 에 h.hacker_id, h.nam e 이 두개의 컬럼을 다 group으로 묶어줘야 되는 이유가 있나요? 이해가 되지 않습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예 [질문 내용] 컬렉션의 필요성에 대해 질문 좀 드리겠습니다 - 인프런 | 질문 & 답변 (inflearn.com) 여기서 궁금한 내용있습니다!. 1)"생각하신 내용이 맞습니다. 중간 테이블을 중심으로 조회가 가능하다면 크게 문제가 없습니다. 하지만 때때로 중간 테이블을 중심으로 조회하기 어려운 경우들도 있습니다." 김영한 강사님의 답변 내용 중에 떄떄로 중간 테이블을 중심으로 조회하기 어려운 경우가 어떤 경우인지 구체적으로 알려주실수 있나요?? 일단 다대다=>중간테이블 필요=>성능 최적화 필요하면=>중간테이블에 해당하는 리포지토리 생성후 (Spring data JPA에서) @Query(fetch join)사용하는식으로=> 맨날 이런식으로 했었는데 중간 테이블 중심으로 조회하기 어려운 경우가 어떤 경우인지 궁금합니다. 2)BatchSize를 사용하는 경우 일대다의 일의 collection에 해당하는 다( members) 를 일의 BatchSize에 해당하는만큼 가지고 오지 않습니까? for (Team team : teams) { System.out.println("team:"+team.getName()); for(Member mem:team.getMembers()){ System.out.println(mem.getUsername()); } } 여기서는 성능 최적화가 이해가 됩니다!. team이 붙어있으므로 배치 사이즈만큼만은 mem.getUsername()이 호출되어도 또 그때동안은 쿼리가 안나가니깐요. 근데 궁금한게 IN 쿼리에 들어가는게 BatchSIze만큼의 TeamID인데 연속한 ID만큼 나가는 걸로 알고 있는데 위처럼 연속한 경우는 몰라도, Team을 이것저것 조회하고 그에 대한 member의 메서드를 호출하면 이게 성능상 좋은가요?
안녕하세요, 양질의 강의 항상 감사드립니다! 다름이 아니라 현재 실무에서 스프링 배치를 이용해서 데이터를 DB to DB 로 마이그레이션하는 업무가 있는데 이를 강의에서 배운 카프카 커넥트를 활용하면 좋을것 같아서 고민중인데 잘 안풀리는 부분이 있어 질문드립니다 데이터 가공문제 DB to DB 로 이관시 가장 좋은것은 커넥트만 써서 코드개발없이 마이그레이션 해버리는 것이 좋을것같은데 막상 실제 마이그레이션 할 때는 source 에서 퍼온 데이터를 sink 시 몇몇 컬럼은 데이터 가공하거나 없어지는 등 가공에 약간 손을 봐야하는 경우가 종종 있어서 이런 케이스에 대해 어떻게 해결을 해야할 지 고민입니다. 고민을 해봤을 때 해결방안으로는 streams api 를 껴서 아래와 같은 아키텍쳐로 해결하는 방법이 있을 것 같은데요 source -> topic -> kafka stream api 등을 통해 데이터 가공 후 topic 전송 -> sink 커스텀 sink 나 source 커넥터 개발 어느 방법이나 결국 추가개발이 필요한건 매한가지라 현재 배치로 개발해놓은 구조를 커넥트를 이용하도록 바꿨을 때 이점이 명확하게 안보여서 좀 고민입니다... 데이터 마이그레이션 후 검증문제 실무에서 배치로 마이그레이션 후 원본데이터가 있는 source db 와 마이그레이션 한 sink db 간에 건수비교 등 데이터 이관이 잘 되었는지 대사비교를 진행하는데요, 카프카 커넥트로 전환한다고 해도 이러한 대사비교는 여전히 필요하지 않을까 싶은데 실무에서 카프카 커넥트를 활용할 때 이러한 검증 문제를 어떻게 해결하는지 궁금합니다 카프카 커넥트를 실무에서 활용한 경험이 없다보니.... 강사님이라면 이러한 문제에 직면했을때 어떤 생각을 가지실 지 궁금합니다! 감사합니다:)
DiscountPolicy와 같은 인터페이스들을 fixdiscount, ratediscount 등 클래스가 상속을 받고 main에서 클래스를 사용할때 부모클래스로 구현을 하잔아요 예를 들어 영상에서 코드를 보면 DiscountPolicy discountpolicy = new RateDiscountPolicy 의 형식처럼 구현되는데 만약에 자손 클래스에 새로 메서드를 추가를 했는데 그 메서드를 부모가 가지지 않았다면 그 메서드를 다운캐스팅을 통해 쓰는 건가요?? 아니면 메서드를 부모 인터페이스에도 적어주어 오버라이딩으로 활용하는 것이 좋나요? 수업에서 계속 다형성을 활용해 진행하기 때문에 이런 궁금점이생겼습니다.
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyWebView("https://www.daum.net/") } } } @Composable fun MyWebView(url : String) { AndroidView(factory = { WebView(it).apply { loadUrl(url) } }) } 강사님의 노고에 다시한번 감사드립니다 위의 코드를 작성한 후 AndroidManifest.xml 의 내용에 <uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true" > 두가지를 추가한 후 앱을 실행하니 에뮬에 아래와 같은 오류가 뜨네요
listbox = [15,46,78,24,56] def min_max(data): mi = min(data) ma = max(data) return mi,ma min_max(listbox) 이 부분에서 코드가 어느 단계로 움직이는지 이해가 잘 안됩니다.min_max라는것을 임의로 지정해주고, mi에 최솟값,ma에 최대값을 저장하는것까지는 알겠는데, 그 밑에 부터 이해가 안가요return에 mi,ma는 위로 되돌아가라는건가요? 밑에 왜 다시 min_max(listbox)를 해주었을때 15,78이 나오는지 모르겠어요. listbox안에는 15,46,78,24,56이 저장되어 있는거 아닌가요? 그리고 data라는 입력값을 써주었는데 코드에 보면 data라는 값을 지정을 안해주었는데 어떻게 오류가 안나는건지도 궁금합니다!
spring boot 3.0이상에서 H2 사용할 때 test connection에서 실패하는 경우가 있을 수 있습니다. 에러 메시지로 Database "mem:testdb" not found, either pre-create it or allow remote database creation. 이 뜬 경우 아래와 같은 해결책을 사용할 수 있습니다. 우선 에러의 원인은 mem:testdb 데이터베이스가 존재하지 않기 때문에 발생합니다. H2 1.4이상 버전부터는 보안 상 문제 때문에 스프링부트 기동 시 데이터베이스 자동 생성을 막아두었다고 합니다. DB가 없으니 위와 같은 에러 메시지가 발생한 것이죠. H2 dependency 버전을 다운그레이드 시켜도 되겠지만, 솔직히 최신 버전의 dependency를 사용하고 싶잖아요? 문제 해결을 위해서 수동으로 데이터베이스를 생성하면 됩니다. 해결법은 생각보다 간단한데요. 임의의 더미 Entity를 만들어서 DB 생성을 유도하게 만들면 됩니다. 자세한 방법은 해당 블로그의 글을 참고하시기 바랍니다. https://shanepark.tistory.com/435
6:22초에 저장을 누르면 로고가 목업에 입혀지는것을 볼 수 있다고했는데, "저장"이라는 글자는 안보이고 "X"를 눌렀을 때 저장이 뜨긴합니다. 그래서 저장을 누르면 목업에 입혀지지 않고, 그냥 닫혀버립니다. ... 강사님께서 가져오신 목업의 자료도 올려놓지 않고 어떤 목업이라는 사이트에 어떤걸 가져오셨는지 언지도 하지않고 갑자기 시작해버려서 어떤 목업을 사용했는지는 모르겠지만 저는 목업월드에서 Business card 검색해서 나온것으로 가져왔습니다. 결론적으로 질문은 저장을 눌렀을 때 목업에 입혀지지 않고, 그냥 닫혀버리는것이 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //persistence.xml에 설정한 UnitName을 인자로 넣어주면 해당 persistence.xml 읽어서 // 팩토리 생성 완료. (내부적으로 jdbc 써서 DB와의 connection도 완료된 상태) EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeam(team); em.persist(member); em.flush(); em.clear(); ///////////////////////////////////////////// Member findMember = em.find(Member.class, member.getId()); Team findTeam = findMember.getTeam(); System.out.println(findTeam.getName()); tx.commit(); } catch(Exception e) { tx.rollback(); } finally { em.close(); } 수업 듣다가 궁금한 점이 생겨 질문 남깁니다! em.clear() 하면 영속성 컨텍스트 초기화 되니까 그 다음 em.find() 는 DB서버에 쿼리문 날려서 내부적으로 객체 필드 초기화해서 반환합니다. 그런데 DB에는 TEAM_ID 컬럼에 그냥 숫자가 들어가있는데 어떻게 findMember의 Team 필드가 해당하는 Team객체로 초기화 될 수 있었던건가요?? <가설> /////////////////////////////////////////// 표시한 부분 바로 아래의 Member findMember = em.find(Member.class, member.getId()); Member 엔티티 객체의 team 필드와 Member 테이블의 TEAM_ID가 @JoinColumn 연관 관계 및 FK 설정 되어있다. referencedColumnName 의 default 값으로 인해 MEMBER 테이블의 FK가 TEAM 테이블의 PK를 참조한다. em.find(Member.class, member.getId()); 하면 JPA가 TEAM_ID(FK)로 MEMBER 와 TEAM을 JOIN해서 얻은 데이터로 원하는 Member 객체와 연결된 Team 객체를 초기화할 수 있다. Team 객체 초기화한 것을 Member 객체의 team 필드에 넣어서 Member 객체 초기화를 완료한다. 이를 반환한다. 이렇게 생각하는 것이 맞는건가요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] Transactional이 작동을 안 하길래 찾아보다가, DataSourceUtils.getConnection을 사용하지 않고, (DataSource 객체).getConnection을 써서 그런간가 싶어서 이것을 수정하려 했는데, 이러니까 테스트 코드가 작동이 안되네요... 테스트 코드와 DataSourceUtils가 어떠한 연관이 있는 건가요? (DataSource 객체).getConnection으로 DB를 연동하면 테스트 코드가 잘 되는데, DataSourceUtils.getConnection으로 하면 실행할땐 잘 되지만, 테스트 코드로 하면 데이터베이스 연동에 오류가 나는 것 같네요...
const reduce = (f, iter, acc) => { if (acc === undefined) { iter = iter[Symbol.iterator]() acc = iter.next().value } for (const v of iter) { acc = f(acc, v) } return acc } console.log(reduce(add, [1, 2, 3, 4, 5], 0)) console.log(reduce(add, [1, 2, 3, 4, 5])) 강의 언제나 즐겁게 듣고 있습니다! reduce 파트 듣다가 js reduce에 가까운 구현은 이쪽이 아닐까 싶습니다! 초기 값이 존재하지 않을 때, 배열의 첫번째 요소를 사용하는 사례를 더 잘 표현한 것 같습니다.