실무에서의 Projection 방식
미해결
실전! Querydsl
안녕하세요. 실무에서는 프로퍼티 접근/필드 직접 접근/생성자/@QueryProjection 4가지 방식중 어떤걸 가장 많이 사용하나요? 상황에 따라 다르겠지만 일반적으로 실무에서 많이 사용되는 방법과 영한님의 생각을 듣고 싶습니다. 감사합니다.
- JPA
- java
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
실전! Querydsl
안녕하세요. 실무에서는 프로퍼티 접근/필드 직접 접근/생성자/@QueryProjection 4가지 방식중 어떤걸 가장 많이 사용하나요? 상황에 따라 다르겠지만 일반적으로 실무에서 많이 사용되는 방법과 영한님의 생각을 듣고 싶습니다. 감사합니다.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 ㅎㅎ강의 잘 듣고 있습니다. Q1. 유저레벨 스레드? 커널레벨 스레드? 선싱님 강의를 수강하니 운영체제 수업에서 배운 내용들이 하나 둘씩 기억나서 매우 반갑네요. 제가 기억하는 내용을 적어보면, 일반적으로 IO나 인터럽트에 의해 발생하는 프로세스 문맥 교환과 매우 유사하게 쓰레드도 레지스터나 캐시의 정보들을 주 메모리로 옮기는 과정을 운영체제가 도맡아 담당하게 됩니다. 때문에 쓰레드간의 문맥 교환시에 Kernel모드로 진입한다고 말씀하신거겠죠. 궁금한점은 쓰레드의 구현 방식에 따라? (아마 유저 레벨 쓰레드와 커널 레벨 쓰레드로 구별하는 것 같습니다.) 문맥 교환의 비용이 차이가 난다고 어디선가 배운 기억이 납니다. 본 강의에서 사용한 쓰레드는 생성시 라이브러리 함수를 사용했고.. 아마 내부적으로 시스템 콜을 호출했고 결과적으로 유저가 아닌 Kernel이 스케쥴링하니 커널레벨 스레드인 것 같은데요.. 그렇다면 유저레벨 스레드라는건 어떤걸까요? 유저(개발자)가 문맥교환을 담당하고 스케쥴링도 담당하는, 모든걸 개발자가 도 맡아하는 스레드인가요? 실제 유저 레벨 스레드가 많이 사용되는 경우는 어떤 경우인가요? Q2. AutoResetEvent는 Kernel단으로 내려가서 문맥교환으로 인해 spinlock보다 성능이 저하될 수 있다고 말씀하셨습니다. 궁금한건 sleep 혹은 yield또한 cpu의 점유권을 포기한 상태에서 다른 스레드를 실행할 수 있기때문에 kernel로 진입후에 문맥교환이 발생하고 이에따른 성능 저하가 일어날 수 있을까요?
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
처음에 메인에서 t.Start();가 Console.WriteLine("Hello World!")보다 먼저 와 있어서 제 생각에는 먼저 Hello Thread!가 먼저 찍힐 줄 알았는데, 실행해보면 Hello World!가 먼저 찍히고 Hello Thread!가 찍히더군요. 그렇다는건 이 Thread라는 일꾼은 메인이 끝난 뒤에야 실행된다는 건가요??
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 Bind 함수를 이해하려고 해도 너무 어려워서 아래와 같이 Bind 함수의 개념도(?)를 그려보았는데 제대로 이해한 것인지요? 아울러 추가적인 두 가지 질문에도 답변해 주시면 감사하겠습니다. 늘 강의 잘 듣고 있습니다. 고맙습니다.
미해결
실전! 스프링 데이터 JPA
안녕하세요! 16:39초 정도까지 강의를 듣다보면 DTO로 변환해서 넘기는 모습을 볼 수 있습니다. 그런데 응답값을 확인해보면 totalElements, last, size, number, sort, first, empty 등 페이징에 관련한 모든 필드들이 나가더라구요. 그냥 클라이언트에서 필요한 부분만 정제해서 내보내야할 것 같은데 실무에서는 어떠한 방법을 사용하나요?
미해결
실전! 스프링 데이터 JPA
slice 의 경우 size 3으로 요청하면 limit 가 4로 나가는데요, 이렇게 하면 실제로 쿼리를 돌려보면 결과가 4개가 나옵니다. 그런데 content.size() 가 3이 나오는 이유는 뭔가요? 스프링데이터 JPA 에서 알아서 마지막 결과는 날려버리는 건가요?
미해결
실전! 스프링 데이터 JPA
안녕하세요. 이전부터 말씀해주신 CQRS에 관해서 간단한 질문이 있습니다. 예를 들어 Member엔티티에 관해 아래처럼 2개의 레포지토리로 쪼갠다고 가정할게요. - MemberQueryRepository(읽기) - MemberCommandRepository(쓰기) 저희가 JPA Data의 이점을 살리려면 JpaRepository를 상속받아서 사용한다고 강의에서 배웠는데요. 읽기 관련 쿼리가 들어있는 Query와 쓰기 관련 쿼리가 들어있는 Command 2개의 레포 모두 JpaRepository를 상속받아서 사용하나요? JpaRepository에는 단순 find~로 시작하는 읽기 메소드뿐만 아니라 delete, save등 쓰기에 관한 메소드도 같이 들어가있어서 읽기/쓰기 레포에서 모두 상속받아서 사용한다면 나중에 작업을 할 때 단순 조회/저장/삭제 등을 어떤 레포에서 사용해야할 지 혼란이 올 것 같습니다. CQRS에 대해서는 이론만 알고있었지 실제로 적용해본적이 없어서 많이 혼란스럽네요. 감사합니다 :)
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요. enum type에 대해 실무 사용은 어떻게 사용하시는지 질의드립니다. emum type을 대부분 string 으로 사용하시는데 실문에서도 동일하게 사용하시나요? 아니면 enum에 code를 지정해서 공통 코드로 DB에서 따로 관리하시는지 궁금합니다~!
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요! 스프링 빈의 역할이 무엇인지 잘 모르겠습니다..! 빈 자체의 개념이 이해가 안가서 서치를 좀 해보니 " 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다고 생각해보자 요청 한 번에 5개의 오브젝트가 새로 만들어지고 초당 500개의 요청이 들어오면, 초당 2500개의 새로운 오브젝트가 생성된다. 서버가 감당하기 힘들다." 그래서 빈이 필요하다 라는 말을 봤는데 그 필요성은 알겠으나 정확하게 빈이 무엇인지 모르겠습니다 또한 왜 new로 선언하면 빈이 되지 못하는건가요?
미해결
실전! Querydsl
영한님 안녕하세요. 덕분에 점점 JPA가 재밋어지고 최적화에 재미를 들이고 있습니다. 강의 중에 데이터를 초기화 하는 클래스를 main 패키지 하단에 두셧는데요. 보통 저런 데이터 초기화 클래스를 test 패키지에 안두고 main에 두어도 상관 없는지 궁금합니다. 실무에선 보통 저런 초기화 데이터를 실제 어떻게 만들고 관리하는지도 궁금합니다. 감사합니다.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요. 좋은 강의 잘 보고 있습니다. 이동을 할때 패킷을 한칸 이동하는 애니메이션이 끝날때 보내는 것으로 설명하신거 같은데요. 이동 시작할때 보내는 것과 차이가 있을까요? 예를 들면, 나와 상대의 위치 사이에 한칸의 빈 공간이 있고, 거의 동시에 (상대가 미세하게 먼저 이동) 빈 공간으로 이동한 경우라 하면... 이동 애니메이션이 끝났을 때 패킷을 보내게 되면 나의 캐릭터가 빈공간에 거의 도착을 했을 때 상대 이동 패킷을 서버에서 받게 되므로 내 위치가 원래 위치로 복귀하게 되고 상대가 이동을 시작하게 되는 것 같네요. 만약 이동 시작할 때 패킷을 보내는 경우라면 나의 캐릭터가 이동중에 패킷을 받게 되므로 상대 캐릭터도 이동하여 빈공간에서 겹쳐보이다가 서버 판정으로 내 캐릭터가 원래 위치로 복귀하게 될 거 같네요. 이렇게 생각하는게 맞는건가요?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의중, 연관관계 편의 메서드는 연관관계의 주인으로 설정된 엔티티에서 형성하는 것이 좋다고 하셨는데 Order 엔티티에 // 연관관계 메서드 public void setMember (Member member) { this . member = member ; member.getOrders().add( this ) ; } public void addOrderItem (OrderItem orderItem) { orderItems .add(orderItem) ; orderItem.setOrder( this ) ; } public void setDelivery (Delivery delivery) { this . delivery = delivery ; delivery.setOrder( this ) ; } 이렇게 메서드를 구성했습니다. 그러나 Order - OrderItem 두 엔티티가 갖는 연관관계에서 주인은 OrderItem입니다. 그렇다면 Order에 .addOrderItem()을 없애고 OrderItem 엔티티에 public void setOrder (Order order){ this . order = order ; order.getOrderItems().add( this ) ; } 위와 같은 편의 메소드를 추가하는것이 맞지 않을까 질문합니다!
해결됨
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요. 비전공자로써 국비지원 학원을 수료한 취준생입니다. 학원에서 만들었던 프로젝트가 포트폴리오로 내세우기에는 너무나도 부족해서 선생님의 강의를 들으며 프로젝트를 새로 만들 계획입니다. 프로젝트를 만드는 과정에서 무척 궁금한 부분이 생겼는데 바로 '이미지 첨부' 에 관한 것입니다. 학원에서 프로젝트를 만들 때는 모르는 부분이 있으면 구글링하고 이것저것 헤딩해보면서 하다보니 그때 사용했던 방법은 Multipart를 통해 이미지를 프로젝트 파일 내에 있는 폴더에 저장하는 방식 을 사용했습니다. 하지만 돌이켜 생각해보니 이미지를 많이 사용하는 사이트를 만든다고 했을 때, '프로젝트 파일의 용량이 너무 불어나면 안 좋지 않을까?' 하는 생각이 들었고, 또한, 기왕에 프로젝트 제대로 만들어 볼 거 AWS Free tier를 활용해서 배포까지 해야 취업에 유리하지 않을까 싶어서 배포단계까지 가는 것을 목표로 하고 있는데요. 그렇다고 했을 때, 배포 중인 애플리케이션의 이미지 첨부 기능에 에러사항이 있지는 않을까, 하는 걱정이 앞섭니다. (아직 애플리케션을 배포해 본 경험은 없습니다...) 사실, 구글 클라우드 스토리지라는 것이 있다기에 연동은 해봤지만 제대로 활용해보지는 못했습니다. 필요하다고 하면 다시 제대로 배워 볼 생각입니다. 이하 각설하고 제 질문은, 1. 실무에서 이미지 첨부 기능을 주로 어떤 스토리지 방식에 의존하는지 2. 작은 규모의 프로젝트이지만 이미지가 약 100장(+이미지 첨부 게시판) 정도일 때 어떤 스토리지 방식을 채택하는 것이 좋을지 입니다. 이게 참... 강의 주제에 벗어나는 질문이지만 너무 궁금한 부분이고, 비전공자이다보니 주변에 실무 종사자 분들이 없어서 실례를 무릅쓰고 이런 질문을 올려보게 되었습니다. 혹시라도 다른 실무 종사자 분들의 조언이 또 있다면 감사히 받겠습니다.
해결됨
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 선생님, 복습겸 다시 보고 있는데 뭔가 이해가 안되는 현상이 생겨서 질문드립니다. 제가 처음에는 선생님이 하는 방식대로 아래처럼 @SequenceGenerator를 사용했습니다. @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 1 ) 그러고 나서 JpaMain으로 테스트를 해서 시퀀스 생성 + insert 되는 거까지 확은을 했습니다. 그런데 initialValue와 allocationSize는 default 값이 각각 1, 50 이라길래, 아래처럼 코드를 수정하고 바로 JpaMain 을 다시 실행해봤습니다. @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ" ) 그랬더니... " The increment size of the [MEMBER_SEQ] sequence is set to [50] in the entity mapping while the associated database sequence increment size is [1] " 이라는 에러가 터집니다. 심지어 DDL 조차도 로그에 찍히지 않습니다. 원래라면 persistence.xml 에서 hibernate.hbm2ddl.auto 를 create 로 주었으니, 기존 시퀀스는 다 drop 하고 다시 생성하는 DDL 이 보이면서 동작할 텐데, 그러지도 않네요. 어디서부터 잘못된건지 감이 안 잡힙니다. 대체 왜 이러는 걸까요?
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 UnityChan이 몬스터를 클릭했을 때 제대로 attack이라는 판정이 안들어가는 것 같아서 확인해봤는데 raycasting이 몬스터에 가까워질수록 하늘을 주시하더라구요 무슨 문제인가요?
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요 현재 2D 관련 피격 판정 강의를 보다가 3D 지형같은 경우 어떻게 처리해야 할지에 대해 궁금해서 글을 남깁니다. 제가 현재 진행중인 프로젝트는 3D 기반의 5x5km ~ 8x8km의 오픈월드 인데요. 3D 지형이라서 언덕과 산과 같은 것들로 인해 굴곡이 져있고 게다가 오픈월드라서 많은 오브젝트들이 배치되어 있는데 이 부분에 대해 어떻게 해야할지 고민스럽습니다. 피격 판정 및 장애물을 지날수 있느냐 없느냐도 결국엔 맵 정보가 서버에 있어야 가능할 텐데 이 부분을 어느정도는 클라이언트 딴에서 처리하는 방식으로 해도 괜찮나요?.. 학부 수준에서 소수의 인원이 모여서 하는 프로젝트라 모든 것을 엄격하게 서버에서 처리할 필요는 없기는 한데 그래도 서버에서 처리를 하는 것이 당연히 맞다고는 생각하지만 방법이 떠오르지가 않습니다 ㅠ 모든 것을 1,0으로 처리하기에는 3D라 z축 기준에서는 또 이게 적용이 되는지 잘 모르겠구 맵도 넓고 오브젝트도 너무 많아서 그렇게 했다가는 엄청난 용량이 발생할 거 같다는 생각도 듭니다. 3D 지형에서는 어떤식으로 맵에 관한 정보를 뽑아오는지 그리고 넓은 오픈월드 안에 있는 모든 오브젝트들 또한 정보를 어떤식으로 뽑아오고 서버에서 이것을 어떻게 관리해야하는지 조언 해주시면 정말 감사하겠습니다!!
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 강의에서 사용하신 Knight가 없어서 다른 애니메이션을 가져왔습니다. attack 애니메이션을 unityChan에 적용하면 왜인지 모르겠지만 땅에 박혀있더라구요 auto로만 사용했을 때는 잘 되는 것 같은데 auto와 Unity model이 정확히 뭐가 다른건가요?..
미해결
실전! 스프링 데이터 JPA
안녕하세요 영한님 ! 어제 h2 관련해서 질문을 드렸었는데요 좋은 답변 감사했습니다! 다름이 아니라 service unit test 를 하는 과정에서 repository 의 Pageable 을 mock 으로 주입해야 하는 상황이 왔습니다. 현재 junit 5 의 bdd 를 이용해서 테스트를 하고 있는데요, junit5의 bdd 역시 영한님은 잘 아시겠지만 given()을 이용해서 JpaRepository.findAll(Pageable pageable) 이 호출되면 willReturn() 으로 반환되는 반환 값을 가짜로 주입해야 하는 상황입니다. 하지만 여기서 어떻게 Page<Entity> pagedEntitied 를 주입해야 하는지 몰라 진행이 힘들더라구요 ㅠㅠ 수업의 방향과 상관 없는 내용이라 실례임을 인지하고 있지만 어떻게 해결해야 할지 도통 갈피를 못 잡아서 질문드려 봅니다.. import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class MemberServiceTest { private MemberService memberService; private final MemberRepository memberRepository = mock(MemberRepository.class); @BeforeEach void setUp() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE) .setFieldMatchingEnabled(true); memberService = new MemberService(memberRepository, modelMapper); // 문제의 willReturn 반환 타입.. 현재는 null을 넣어놨습니다. given(memberRepository.findAll(any(PageRequest.class))).willReturn(null); } @Test @DisplayName("모든 사용자 조회") void getMembers() { // when PageRequest pageRequest = PageRequest.of(0, 5); // then Page<MemberResponseData> pagedData = memberService.getMembers(pageRequest); assertEquals(pagedData.getSize(), 5); } } @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; private String password; private String nickname; public static MemberResponseData fromEntity(Member member) { return MemberResponseData.builder() .email(member.getEmail()) .nickname(member.getNickname()) .build(); } } // Page<MemberResponseData>에 해당하는 MemberResponseData(DTO) @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class MemberResponseData { private String email; private String nickname; } // MemberService @Service public class MemberService { private final MemberRepository memberRepository; private final ModelMapper modelMapper; public MemberService(MemberRepository memberRepository, ModelMapper modelMapper) { this.memberRepository = memberRepository; this.modelMapper = modelMapper; } /** * 모든 회원을 조회한다. * * @param pageable : 페이징 정보 * @return 모든 회원 */ public Page<MemberResponseData> getMembers(Pageable pageable) { return memberRepository.findAll(pageable).map(Member::fromEntity); } }
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
수정을 하고 싶을 때, 값 타입 컬렉션 경우에는 .remove()와 .add()를 사용하여 아래와 같이 했습니다. findMember.getAddressHistory().remove(new AddressEntity("oldCity1", "street1", "10000")); findMember.getAddressHistory().add(new AddressEntity("newCity1", "street1", "10000")); 그렇다면, AddressEntity를 사용하여 엔티티의 경우에는 아래와 같이 사용하면 되나요? AddressEntity addressEntity = em.find(AddressEntity. class, 2L ) ; Address address = new Address( "newCity1" , "street1" , "10000" ) ; addressEntity.setAddress(address) ; setAddress와 같이 커밋시점에 변경 감지로 수정을 할 수 있다고 생각했습니다.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 Json파일을 추가하고 긁어온 데이터를 Log를 찍는 과정에서 프로젝트가 다음과 같이 에러를 뱉어냅니다. Unity에서 StatData.json을 더블클릭해서 열면 한번 외부에서 수정했다는 문구가 뜨면서 솔루션 탐색기에서 아이콘이 변경되고 이후부터는 UNITY에 연결도 안되고 디버깅도 안됩니다..