실무에서의 Projection 방식
미해결
실전! Querydsl
안녕하세요. 실무에서는 프로퍼티 접근/필드 직접 접근/생성자/@QueryProjection 4가지 방식중 어떤걸 가장 많이 사용하나요? 상황에 따라 다르겠지만 일반적으로 실무에서 많이 사용되는 방법과 영한님의 생각을 듣고 싶습니다. 감사합니다.
- JPA
- java
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
실전! 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라는 일꾼은 메인이 끝난 뒤에야 실행된다는 건가요??
미해결
실전! 스프링 데이터 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에 두어도 상관 없는지 궁금합니다. 실무에선 보통 저런 초기화 데이터를 실제 어떻게 만들고 관리하는지도 궁금합니다. 감사합니다.
미해결
모든 개발자를 위한 HTTP 웹 기본 지식
안녕하세요 영한님~~ 항상 좋은 강의 정말 감사합니다~ㅎㅎ 다름이 아니라 쿠키 관련해서 질문 드릴 부분이 있어 이렇게 질문을 남깁니다~ 쿠키 라이프사이클에는 세션 쿠키와 영속 쿠키가 있는대 세션 쿠키는 서버에서 발급한 세션아이디를 발급받아 저장하는 쿠키이며 다음 요청 시 해당 쿠키에 저장된 세션아이디를 통해서 세션에 저장된 정보를 가져간다고 이해하였습니다. (그러므로 브라우저가 종료될때 세션이 종료되므로 쿠키도 사라진다.) 그렇다면 영속 쿠키는 브라우저가 종료되어도 해당 쿠키는 살아있으므로 세션아이디를 따로 발급을 안받는건가요~? 그렇다면... 쿠키에 저장된 정보를 서버에 전송을 따로 안하고 클라이언트 측에서만 처리하는지가 궁금합니다🙏🏻
미해결
모든 개발자를 위한 HTTP 웹 기본 지식
영한님 안녕하세요. 우선 너무 좋은 강의 듣고 많은 도움 받고있습니다. 항상 감사합니다!! ㅎㅎ 공부하다가 몇가지 궁금한게 생겨서 질문드립니다!! 1. HTTP 요청 메세지에서 궁금한게 있습니다. 예를들어 GET의 경우 크게 start-line, header로 구성되어 있는데, 혹시 QueryString으로 들어오는 parameter들은 HTTP 메세지 구조에서 어디에 속해서 들어오는지 알 수 있을까요?? 코드를 직접 짜서 확인해보니 request.getParameter() 이런식으로 확인 가능한데 이 parameter가 header에 속하는지 아니면 그 위의 start-line에 속하는지 어떠한 위치에 들어오는지 궁금합니다. 2. 개인 프로젝트를 진행하면서 QueryString으로 들어온 파라미터에 대해 검증하는 부분을 처리해야하는 상황이 생겼는데, 이부분에 있어서 인터셉터, AOP 두가지를 고민중에 있습니다. 개인적으로 느끼기엔 AOP에서는 dto 형태로 파라미터들을 받아와서 사용할 수 있기에 간편하다 생각해 현재 AOP로 적용을 시켰습니다. 혹시 실무에서는 이러한 부분을 어떻게 처리하는지 궁금합니다. 감사합니다!! 건강하세요 ㅎㅎ
미해결
실전! 스프링 부트와 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장(+이미지 첨부 게시판) 정도일 때 어떤 스토리지 방식을 채택하는 것이 좋을지 입니다. 이게 참... 강의 주제에 벗어나는 질문이지만 너무 궁금한 부분이고, 비전공자이다보니 주변에 실무 종사자 분들이 없어서 실례를 무릅쓰고 이런 질문을 올려보게 되었습니다. 혹시라도 다른 실무 종사자 분들의 조언이 또 있다면 감사히 받겠습니다.
미해결
모든 개발자를 위한 HTTP 웹 기본 지식
네트워크 강의는 들을수록 재미있기도하고 라이브코딩도 없어서 그냥 이야기꾼이 이야기해주는가보다 하고 듣고있습니다. 뭐 물론 이해를 잘하고 넘어왔는지는 모르겠지만요 ㅠ 그리고 듣고나서 나와 같은 강의를 들었을 사람들이 어떤 질문을 했는지도 모두 읽어보고 넘어갑니다. 사람마다 같은 강의를 보더라도 생기는 의문은 아주 다양하더라구요?? 단순 수업내용에 대한 질문부터 기술의 한계점에 대해 의문을 가지시는분, 보안이슈, 현업 적용 등등 아주 다양한 주제의 질문들이 쏟아져나옵니다. 근데 강사님께서는 그 모든 질문에 빠짐없이 디테일하게 대답을 해주시는거보고 엄청 대단하게 느껴지면서도 신기했습니다. 저는 이제 막 졸업한 취준생이라서 아직 현업에 대해 잘 모르지만 어디든지 제가 웹 개발자가 되어서 바쁘게 살다보면 그런 지식들은 자연스레 획득하게 되는것일까요?? 아니면 강사님이 그저 다른 개발자들보다도 많은 경험을 했던것일까요?? 다음 강의 시청하러 가겠습니다! 수업 잘 듣고 있습니다.
해결됨
자바 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 이 보이면서 동작할 텐데, 그러지도 않네요. 어디서부터 잘못된건지 감이 안 잡힙니다. 대체 왜 이러는 걸까요?
미해결
실전! 스프링 데이터 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와 같이 커밋시점에 변경 감지로 수정을 할 수 있다고 생각했습니다.
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 강사님. 강의 보며 많이 배우고 있습니다. 강의 내용대로 쭉 따라가며 진행하고 있는데 회원가입 부분에서 회원가입 제출 누르면 홈으로 리다이렉트가 안되고 403에러와 화이트라벨 페이지로 이동하게 됩니다. create 메서드에 로그를 찍어도 안찍히는걸 보니 해당 post 매핑이 잘못되었나 하여 준비해주신 자료에 있는 소스를 복사해 똑같이 붙여넣기해도 마찬가지네요... 혹시 원인이 무엇일까요..ㅠㅠ
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 영한님 매일매일 강의 정말 너무너무 잘 듣고 있습니다. 수업과 살짝 관계가 없을 수도 있는 질문일수도 있지만 궁금해서 여쭤봅니다 ... ^^ 수업에서 사용하시는 케이스는 전부 관계형 데이터 베이스를 사용하는 경우, JPA를 어떻게 잘 사용할지에 대한 내용인 것 같은데 혹시 NoSQL 계열의 데이터베이스를 사용할 경우에는 JPA를 사용하는 것이 비효율적인지 또는 사용을 못하는건지 같은 관점에서 궁금합니다 (찾아보니까 몽고DB랑 같이 사용하는 케이스가 있는 것 같긴하던데..잘 감이 안오더라구요) 답변 주시면 감사하겠습니다!!
미해결
스프링 시큐리티
안녕하세요, 강의 잘 보고 있습니다. 세션 고정 보호에 대해서 질문이 있습니다. 테스트를 하실때 세션 고정 공격을 위해서 sessionFixation()을 none으로 변경 한 후에 공격자가 웹서버 접속만으로 쿠키에 JSESSIONID가 할당되는 것을 확인했습니다. 제가 기존에 알고 있던 지식은 로그인을 통해 인증 절차를 받아야 사용자 세션이 생기고 세션ID를 클라이언트 쿠키에 담아주는 것으로 알고 있었는데 테스트에서는 인증을 하지 않았는데 어떻게 세션ID가 있는건가요? 아니면 제가 잘 못 알고 있는건지.. 감사합니다!