묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
threejs 질문이요
결과물을 보니 텍스처가 적용이 안되어서 검은색으로만 보이더라고요. 텍스처경로도 맞고 오탈자도 없는데 텍스처 적용이 안 되네요. // Planet const texturePlanet = textureLoader.load('/public/jupiter2_1k.jpg'); texturePlanet.anisotropy = 16; const planetGeometry = new THREE.SphereGeometry(10, 50, 50); const planetMaterial = new THREE.MeshPhongMaterial({ map: texturePlanet, fog: false }); planet = new THREE.Mesh(planetGeometry, planetMaterial); console.log(planetMaterial); planet.position.set(0, 8, -30); scene.add(planet); //Moon const textureMoon = textureLoader.load('/texture/moon.jpg'); textureMoon.anisotropy = 16; let moonGeometry = new THREE.SphereGeometry(2, 32, 32); let moonMaterial = new THREE.MeshPhongMaterial({ map: textureMoon, fog: false }); moon = new THREE.Mesh(moonGeometry, moonMaterial); moon.position.set(0, 8, 0); scene.add(moon); // Sphere Background const textureSphereBg = textureLoader.load('/texture/starlight.jpg'); textureSphereBg.anisotropy = 16; const geometrySphereBg = new THREE.SphereGeometry(150, 32, 32); const materialSphereBg = new THREE.MeshBasicMaterial({ side: THREE.BackSide, map: textureSphereBg, fog: false }); sphereBg = new THREE.Mesh(geometrySphereBg, materialSphereBg); sphereBg.position.set(0, 50, 0); scene.add(sphereBg);
-
미해결스프링 핵심 원리 - 고급편
Proxy객체의 cacheValue에서 동시성 문제가 발생하지 않는지 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]프록시 패턴을 실제 코드에 적용한다고 가정했을 때 Proxy객체의 cacheValue에서 동시성 문제가 발생하지 않는지 궁금합니다! 만약 동시성 문제가 발생한다면 ThreadLocal을 이용해서 해결하면 될까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
객체가 스스로의 리스트를 가지고, 양방향 매핑을 해도 될까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]악! 스프링 웹 개발은 즐거워! 김영한 선생님 질문있습니다.선생님의 두 로드맵을 거의 다 듣고 그를 바탕으로 포폴용 게시판을 만들어보고 있습니다. 와중 댓글과 대댓글 기능을 구현하는 과정에서 Comment라는 객체를 만들고 객체의 타입을 Comment와 reply로 나누었습니다. 특정 게시판에 관한 데이터를 불러올 때 댓글과 대댓글을 편리하게 불러오기 위해 타입이 Comment인 객체가 reply에 해당하는 객체를 리스트로 갖도록 설계했습니다. 이후 테스트를 진행해보았는데 fetch join을 통한 데이터 로드는 문제 없이 진행되었습니다. 다만 이러한 설계 방식이 올바른지에 대한 질문을 스스로 해결할 수 없어서 글 남깁니다. 아래는 코드와 테스트 코드 및 실행 결과이고, 마지막에 질문이 있습니다.package toy.board.domain.post; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.util.StringUtils; import toy.board.domain.BaseDeleteEntity; import toy.board.domain.user.Member; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(callSuper = true) public class Comment extends BaseDeleteEntity { public static final int CONTENT_LENGTH = 1000; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "comment_id", nullable = false) private Long id; @Column(name = "content", nullable = false, length = CONTENT_LENGTH) private String content; @Column(name = "type", nullable = false, updatable = false) private CommentType type; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id", nullable = false, updatable = false) private Post post; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false, updatable = false) private Member member; @OneToMany(mappedBy = "parent") private List<Comment> replies = new ArrayList<>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_comment_id", updatable = false) private Comment parent; /** * 양방향 관계인 Member와 Post에 대해 자동으로 양방향 매핑을 수행한다. */ public Comment( @NotNull final Post post, @NotNull final Member member, @NotNull final String content, @NotNull final CommentType type ) { this.post = post; this.member = member; this.content = content; this.type = type; } public boolean update(final String content) { if (!StringUtils.hasText(content)) { return false; } this.content = content; return true; } public void leaveReply(Comment reply) { if (areTypesCorrectThisAnd(reply)) { throw new IllegalArgumentException("주어진 댓글과 대댓글의 타입이 올바르지 않습니다."); } if (hasComment(reply)) { throw new IllegalArgumentException("대댓글이 이미 다른 댓글에 포섭되어 있습니다."); } if (isNew(reply)) { throw new IllegalArgumentException("댓글이 이미 해당 대댓글을 포함하고 있습니다."); } this.replies.add(reply); reply.parent = this; } private boolean isNew(Comment reply) { return this.replies.contains(reply); } private static boolean hasComment(Comment reply) { return reply.parent != null; } private boolean areTypesCorrectThisAnd(Comment reply) { return this.type != CommentType.COMMENT || reply.type != CommentType.REPLY; } } @Transactional @DisplayName("comment가 List<comment>를 갖고, fetch join으로 가져올 수 있는가?") @Test public void comment_has_comments_fetch_join() throws Exception { //given Member member = Member.builder( "member", new Login("password"), Profile.builder("nickname").build(), LoginType.LOCAL_LOGIN, UserRole.USER ).build(); em.persist(member); Post post = new Post(member, "title", "content"); em.persist(post); Comment comment = new Comment(post, member, "comment", CommentType.COMMENT); em.persist(comment); for (int i = 0; i < 5; i++) { Comment reply = new Comment(post, member, "reply" + String.valueOf(i), CommentType.REPLY); comment.leaveReply(reply); em.persist(reply); } em.flush(); em.clear(); //when QComment reply = new QComment("reply"); List<Comment> findComments = queryFactory .selectFrom(QComment.comment) .leftJoin(QComment.comment.replies, reply).fetchJoin() .where( QComment.comment.post.id.eq(post.getId()), QComment.comment.type.eq(CommentType.COMMENT) ) .fetch(); System.out.println("============================================="); for (Comment findComment : findComments) { System.out.println("findComment.getId() = " + findComment.getId()); System.out.println("findComment.getContent() = " + findComment.getContent()); } //then Comment findComment = findComments.get(0); for (Comment findReply : findComment.getReplies()) { System.out.println("findReply content = " + findReply.getContent()); } }[테스트 실행 시 create query]create table comment ( is_deleted boolean default false not null, type tinyint not null check (type between 0 and 1), comment_id bigint generated by default as identity, created_date timestamp(6), deleted_date timestamp(6), last_modified_date timestamp(6), member_id bigint not null, parent_comment_id bigint, post_id bigint not null, content varchar(1000) not null, created_by varchar(255), last_modified_by varchar(255), primary key (comment_id) )[테스트 실행 결과] select c1_0.comment_id, c1_0.content, c1_0.created_by, c1_0.created_date, c1_0.deleted_date, c1_0.is_deleted, c1_0.last_modified_by, c1_0.last_modified_date, c1_0.member_id, c1_0.parent_comment_id, c1_0.post_id, r1_0.parent_comment_id, r1_0.comment_id, r1_0.content, r1_0.created_by, r1_0.created_date, r1_0.deleted_date, r1_0.is_deleted, r1_0.last_modified_by, r1_0.last_modified_date, r1_0.member_id, r1_0.post_id, r1_0.type, c1_0.type from comment c1_0 left join comment r1_0 on c1_0.comment_id=r1_0.parent_comment_id where c1_0.post_id=? and c1_0.type=?=====================findComment.getId() = 1findComment.getContent() = commentfindReply content = reply0findReply content = reply1findReply content = reply2findReply content = reply3findReply content = reply4 [질문]제가 궁금한 것을 자세히 말하자면,테이블이 만들어질 때, comment 테이블의 특정 row(대댓글인 컬럼)가 해당 테이블의 다른 row(댓글인 row)의 PK값을 FK로 갖는데, 댓글에 해당하는 row는 객체가 생성되고 DB에 저장될 때 해당 컬럼에 null이 저장됩니다. 이는 Comment 객체의 ID에 @GenerateValue 설정을 주어서 그렇습니다. 위의 상황은 실무에서 사용할만큼 적절한가요? 아니라면 대안이 있을까요?jpa와 관련된 질문을 읽다보니, 다대일 관계에서 left join fetch의 경우 where문의 결과에 따라 데이터 일관성의 오류가 나타날 수 있다는 답변이 있었습니다.(해당 글: https://www.inflearn.com/questions/15876/fetch-join-%EC%8B%9C-%EB%B3%84%EC%B9%AD%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4) 제가 작성한 테스트 코드의 쿼리문은 일대다 관계에서 일에 해당하는 엔티티에 별칭을 주어 where문을 적용한 것이므로 일관성의 문제가 발생하지 않는다고 생각했는데 이것이 옳은 생각인가요? 마지막으로 쿼리의 복잡도와 쿼리 개수는 trade off 관점에서, 특정 게시물에 관한 데이터를 반환해야 하는 api 요청이 들어왔을 때, 게시물과 댓글 엔티티가 단방향 관계일 경우 게시물에 관한 데이터와 댓글 및 대댓글에 관한 데이터를 각각의 저장소를 통해 가져오는 것이 좋을까요 혹은 쿼리가 다소 복잡해지더라도 한 번에 가져오는 것이 좋을까요? 아니면 단방향 관계를 양방향으로 만드는 것이 더 나은 선택일까요? 혼자 공부하니 올바른 방식을 찾는게 참으로 어려운 것 같습니다.답변 기다리겠습니다. 감사합니다.
-
미해결[초급] 맛보자! 코틀린과 스프링으로 API 호출하기
findTop10ByOrderByCntDesc 함수의 동작 원리에 대한 질문
interface WordRepository :CrudRepository<WordCount, String> { fun findTop10ByOrderByCntDesc() :List<WordCount> }위 findTop10ByOrderByCntDesc 함수는 선언만 되고 실제 구현이 안되어서 CrudRepository 에도 들어가봤지만 virtual 함수도 아닌걸로 보이는데요..예상하는 바는 repository에서 함수명을 query로 자동 변환하여 가져오는 형식으로 느껴집니다.만약 그렇다면, 이 것은 원래 springframework 기능인 것인가요? (완전 웹개발 초보라서 이렇게 문의드립니다...)
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
17장 질문입니다.
안녕하세요.맛비님 강의를 듣고 많은 도움을 받고 있어, 정말 감사드립니다.17장 관련 질문을 드립니다.조건 i_run에 의해 num_cnt에 데이터가 들어가는 부분에서, 저는 'i_num_cnt의 1 clock뒤에 num_cnt 데이터가 들어 가겠구나' 생각하여 wave를 확인하니 assign문 처럼 데이터가 바로 들어가네요.그래서 제가 간단하게 확인하고자 i_run_d라는 delay를 주기 위해 i_run의 1 clock delay 주는 부분을 추가하여 wave를 확인하니, 이것 또한 assign문 처럼 delay없이 데이터가 바로 들어가는데, 혹시 제가 잘못 생각하고 있는 부분이나, i_run신호의 1 clock delay를 주기 위해서는 다르게 해야 하는 부분일까요?아래는 제가 생각했던 파형 입니다.답변 부탁 드립니다.
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
strLength에서
arr[0] == null위 상황에서 arr[0]인 ''[0]은 undefined라서 니깐 !!arr[0]나 Boolean(arr[0]) 아니면 그냥 !!arr, Boolean(arr)로 체크해주는게 좋을것 같네여
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 저는 자바로만 알고리즘을 풀어온 수강생입니다.일단 저의 코드는 아래 링크와 같습니다.http://boj.kr/c098c62b8ee14b3b88f6058b7d055a29코드를 잘 보시면 4번째 줄에 cnt 배열의 길이를 26으로 설정해두었음에도 통과가 되었습니다.원래대로라면 배열 길이가 200(최소 91)은 되어야대문자 Z까지 다 카운트할 수 있을텐데 제 부주의로 26으로 해버렸습니다이렇게 되면 for(char a : s) cnt[a - 'A']++;로 해줘야 할 줄 알았는데 그냥 통과가 되버렸네요.chatgpt에게 물어본 바로는 그러나 C++에서는 배열의 인덱스가 음수가 아니라면, 범위를 벗어나더라도 컴파일러는 해당 인덱스를 양의 정수로 간주하여 메모리를 접근하려고 시도합니다. 이런 상황에서는 예상치 못한 동작이 발생할 수 있으며, 이는 정의되지 않은 동작으로 분류됩니다. 따라서 코드가 정상적으로 동작하는 것은 운이 좋게 동작하는 경우일 수 있습니다만, 이는 올바른 코드 작성 방법이 아닙니다.자바였으면 ArrayIndexOfBound를 내뿜으며 컴파일오류가 나왔을텐데 통과가 되었다고 해서 약간 당황스럽네요혹시 이게 어떻게 된건지 설명해주실 수 있으실까요?만약을 위해 공유소스 외에도 에러문(?)이 나와있는 링크도 남깁니다.https://www.acmicpc.net/source/65705843감사합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
섹션 24 유효성 검사
섹션 24 에서 빈값 처리를 구현하는것을 보여주셨는데요.html5 에서 제공하는 유효성 검사 <input type="text" required />위와같이 사용하는것과의 차이점이 뭘까요 ??
-
미해결15일간의 빅데이터 파일럿 프로젝트
우지 설치중 오류가 뜹니다
어떤 식으로 해결해야할 지 잘 모르겠습니다 ㅠ밑 캡처본은 Assign Roles 현황입니다
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 환경 통합 질문
안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 사항이 있어서 질문드립니다. 강의 내용처럼 통합 테스트를 수행할 때 여러번 Spring 서버를 띄우는 것을 효과적으로 개선하기 위해 TestSupport 추상클래스를 상속받아 Repository/Service 계층 테스트시에 통합된 환경을 구축하는게 더 좋은 것은 이해했는데요.Controller 테스트의 경우, 강의 내용처럼 따로 스프링을 띄우지 않고 @WebMvcTest로만 테스트코드를 작성하는 경우라면 공통 추상 클래스를 구현하는게 비효율적일수도 있을 것 같아서 궁금증이 생겼습니다.@WebMvcTest(Controllers="Controller.class") 형식으로 컨트롤러 클래스들을 명시해 줘야 하는데, 클래스가 수십개로 많아질수록 매번 추가해야 하고, Controllers에 많은 클래스를 넣어야 하고(패키지 단위로 지정한다든가 등의 방식은 없는것 같더라구요), 각 클래스에서 사용하는 MockBean이 많아질수록 필드가 많아져서 본문이 길어 보기 힘들수도 있을 것 같아서요. @SpringBootTest처럼 서버를 띄우는 비용이 발생하지 않으므로, 각각의 컨트롤러 테스트마다 명시적으로 @WebMvcTest를 사용하고, 해당 클래스에서 사용할 Mockbean 또한 명시적으로 지정하는 방식도 괜찮을까요? 실무적인 관점으로 볼 때, 제 생각대로 Controller 클래스의 테스트는 통합하지 않고 각각 구현하는 건 어떨지 궁금합니다.
-
미해결일주일 완성! 3dsmax 입문 (자동차 및 캐릭터 만들기)
단위환산 질문입니다.
unit setup에서system unit Scale에서다른 씬과 단위를 일치 시키려면 이런식으로 다른 씬에서도 1unit - 10센티미터로 맞춰줘야 하는건지, 아니면 이 값을 조정해서 실제 크기랑 맞춰주면 되는 것인지 궁금합니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
공부 순서를 어떻게 해야할까요
이제부터 제대로 코딩 테스트를 준비하려고 합니다.배열 강의를 듣는중인데 배열 섹션을 다 들었다는 가정하에배열에 관한 알고리즘을 좀 많이 풀어보고 다음 섹션으로 넘어가야할지(4~5일 소요된다는가정입니다.)아니면 매일 배열에 관한 문제를 1~2개 정도 풀면서 다음 강의를 계속 듣고 진도를 나가야할지 궁금합니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
깃허브에 올려봐도 괜찮을까요?
안녕하세요 선생님!깃허브 경험을 쌓고 싶어서 배운 내용을 출처를 남기고 깃허브에 올리면서 해봐도 괜찮을까요??
-
미해결설계독학맛비's 실전 Verilog HDL Season 2 (AMBA AXI4 완전정복)
interconnect bus
=================현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ)강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등)이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요)개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등..글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.)서로 예의를 지키며 존중하는 문화를 만들어가요.질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! )먼저 유사한 질문이 있었는지 검색해보세요.잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.==================SoC on-chip-interconnect bus는 시스템 전체 퍼포먼스에 큰 영향을 주며, 이를 설계/검증하는 것은 매우 어려운 일이라고 하셨습니다.AXI 인터페이스는 정해진 규약대로 설계됩니다. interconnect bus만 따로 설계하는 전문가가 있다면, 그들이 추가적으로 최적화하고 설계하는 부분은 어떤게 있는지 keyword를 알 수 있을까요?고민해본 바로는 SoC내엔 수많은 IP가 있고, 그것은 제품마다 다르기 때문에 각 상황에 어떤 IF를 사용하고, 파라미터들을 어떻게 설정하고, 각 IP들을 어떻게 배치할지 결정하는 것. 이런 것들이 있을 것 같습니다.감사합니다.
-
해결됨웹 프론트엔드를 위한 자바스크립트 첫걸음
서치 기능에 오류가 생겼어요
콘솔 창엔 Uncaught TypeError: Cannot read property 'addEventListener' of null 오류가 뜨며,enter키를 눌러도 이벤트가 작동하지 않습니다. body태그 밑으로 js링크를 옮겨보아도 콘솔창에 여전히 같은 오류가 나옵니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Valid , bindingResult
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]memberController의 create 부분의 로직을 저는 아래처럼 이해했는데 맞게 이해한게 맞을까요 ?@Valid 어노테이션이 있어서 MemberForm의 @NotEmpty 조건을 validation하고 이 단계에서 NotEmpty 조건을 충족시키지 못했을 때 에러가 나는데 그 에러에 대한 내용을 bindingResult로 인해서 에러 정보를 result란 값에 저장한 뒤 result에 에러 정보가 있을 시에 members/createMemberForm으로 페이지 이동 후 createMemberForm html 파일에서 result에 name 에 대한 에러 값이 있을 때 에러메시지를 바인딩하는데 그게 NotEmpty 어노테이션 적용 시 적어뒀던 메시지를 띄우는 걸까요 .. ?전체적인 로직을 제가 맞게 이해한건지 잘 모르겠어서요 ..
-
미해결마이크로넛 자바 클라우드 어플리케이션 제작
강의노트가 어디에 있는지요?
수업중에 강의노트에서 복사해서 사용해야 할 내용이 계속 나오는데어디서 확인할 수 있나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ORDERS와 ORDER_ITEM 테이블 두개가 존재하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 테이블 구조에 대해 의문이 들어서 글 남기게 되었습니다MEMBER 테이블과 ITEM 이 N:M 관계이고 그렇기 때문에 주문(MEMBER_ITEM) 이라는 관계 테이블을 이용해서 MEMBER와 ITEM 간의 N:M 관계를 표현해주면 안되나요?ORDERS 라는 테이블이 존재하는 이유를 모르겠습니다..
-
해결됨Spring Boot JWT Tutorial
requestMatchers 관련 에러 뜨시는 분들 참고하세요
@Bean public WebSecurityCustomizer configure(){ return (web) -> web.ignoring() .requestMatchers(new AntPathRequestMatcher("/h2-console/**")) .requestMatchers(new AntPathRequestMatcher("/favicon.ico")); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .authorizeRequests() .requestMatchers(new AntPathRequestMatcher("/api/hello")).permitAll() .anyRequest().authenticated(); return http.build(); }
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
4-8. 지표 정의 연습 문제 답변
안녕하세요! 매일 혹은 2일에 한강씩 목표로 듣고 있습니다. 매 강의 좋은 내용 감사드려요! 아직 PM으로서 부족한 부분이 많지만 이번 강의 들으면서 많이 성장하고 있다고 생각합니다! 시간나는대로 피드백 부탁드릴게요~ 문제 1. 기능이 잘 동작하고 있는지 확인하려면?동작에 포커스를 둔다면 전체 뷰 수 대비 영역 별 클릭 수(CTR)를 확인해야 한다고 생각합니다!배너 CTR = 배너 영역 클릭 수 / 홈 페이지 뷰 수메뉴 카테고리 CTR = 메뉴 카테고리 클릭 수 / 홈 페이지 뷰 수이런 음식 어때요 CTR = 이런 음식 어때요 내 각 음식 영역 클릭 수 / 홈 페이지 뷰 수동네 맛집 CTR = 동네 맛집 클릭 수 / 홈 페이지 뷰수IF 어떤 기능을 통해 전환이 잘 일어나는지를 확인한다면각 요소 클릭 수 대비 최종 전환인 CVR을 설정할 것 같습니다.질문: 배너나 이런 음식 어때요? 혹은 동네 맛집과 같이 영역이 작은 경우는 자동 롤링이 되거나 사용자가 스크롤하는 경우도 꽤 있습니다. 물론 클릭이 가장 확실한 유저 액션이지만 보수적으로 해당 기능을 사용했는지를 잡아보려면 전체 뷰 수 대비 스크롤 수도 보조 지표로 볼 수 있을까요? 사용자의 경우에는 해당 내용을 인지하고 검색을 해 볼 수 있을 거 같아서요! 문제 2. 검색 기능에 만족했는지 확인하려면검색 기능에 만족을 했다면 검색을 통해 최소 1개 이상의 가게 디테일 뷰를 확인했을 것이라 가정하여 검색 페이지 뷰 대비 상세 페이지 뷰로 CVR을 사용할 것 같습니다.가게 리스트 클릭 수 (or 상세 가게 페이지 뷰 수) / 전체 검색 페이지 뷰 수위 수치를 단순 count 대신 unique로 유저수로 보는 것도 필요할 것 같습니다. 이유는 전체 사용자 중 일부 사용자가 heavy유저라면 단순 count로는 성공적으로 검색을 진행했을 것이라 판단 할 수 있을 것 같습니다. 중복을 제거한다면 전체 검색 사용자 대비 몇 %가 검색 기능을 성공적으로 사용했는지 그 비율을 확인할 수 있습니다.문제 3. 검색 필터 기능의 활성화 지표검색 필터가 사용되었다는 것을 정의한다면 키워드 검색을 했거나, 정렬을 사용하거나, 둘 다 활용했을 수 있습니다. 2번 질문과 유사하게 count와 사용자 수로 CTR을 지표로 정의할 것 같습니다.돋보기 아이콘 클릭 수 or 필터 클릭 수 / 검색 페이지 뷰 수돋보기 아이콘 클릭 유저 수 or 필터 클릭 사용자 수 / 검색 페이지 뷰 사용자 수단, 아이콘 클릭 외에도 사용성을 위해 실제 배민에서는 검색어 입력을 위해 나타나는 키보드에서 엔터로도 검색이 가능하여 아이콘 클릭으로만 한정하지 않고 실제 검색이 일어났을 때 페이지 뷰 수로 보는 것이 더 맞을 것 같습니다.문제 4. 배달 서비스에서 가장 중요한 지표는?가장 주요한 하나의 지표는 매출이라고 생각합니다. 이 매출을 MECE하게 쪼개어 본다면수수료 건당 수수료(매출) 배달 건수광고료기타여기서 가장 중요한 것은 결국 건당 수수료와 배달 건수라고 생각합니다.이유는 광고는 트래픽을 기반으로 보통 가격이 측정되기 때문에 수수료를 구성하는 두 지표를 설정한다면 트래픽을 늘리는 것 또한 포함한다고 생각합니다.만약에 여기서 하나를 더 고려해야 한다면 취소나 환불을 고려하여 순 이익을 늘리기 위한 포커스를 줄 것 같습니다!건당 수수료를 늘리기 위해서 한 번에 배달을 요청하는 금액이 높아야 하기 때문에 일정 금액 이상 시킬 때 할인 쿠폰을 주는 형태의 action item을 생각해볼 수 있습니다.배달 건수를 늘리기 위해서는 배달 건수 자체를 늘리기 위해서 건수에 따라 리워드를 제공하는 방법이 있을 것 같고, 더 이전의 단계에서 진입을 많이 하기 위해 출석체크 이벤트 등을 진행하여 방문을 늘려 자연스럽게 배달을 많이 할 수 있도록 유도할 수 있을 것 같습니다.문제 5. 추천 알고리즘 성능 지표커머스라면 전체 수익 상승률과 해당 기능 세그먼트 유저의 수익을 전체 수익 대비 비율로 확인할 것 같습니다.추천 알고리즘 사용 세그먼트 매출 / 전체 매출월별 매출 상승 현황또 다르게는 알고리즘 사용 세그먼트 결제 전환율이 알고리즘 비사용 세그먼트 결제 전환율에 비해 얼마나 높은지 확인할 것 같습니다. 결국 커머스라면 최종적인 지표는 매출일거라고 생각하여 우선 전체적인 매출이 상승하고, 그 전체 매출에서 해당 기능 사용이라는 공통점이 있는 그룹의 매출의 파이를 확인하여 효과를 확인한다고 생각했습니다문제 6. 여러분들이 사용하는 서비스의 지표저는 서비스로 '브런치'를 설정하였습니다.가장 중요한 지표 → 게시글 작성 건 수플라이휠을 생각해보면 우선 게시글이 있어야 컨텐츠가 있고, 그걸 독자들에게 보여주고 많은 독자가 확인하면 또 새로운 유입을 통해 글이 늘어난다고 생각하였습니다.따라서 그 외 2개를 뽑는다면독자들의 반응을 알 수 있는 조회 수와 인터랙션을 알 수 있는 댓글/좋아요 수를 확인할 것 같습니다.또 하나 고려해야할 점은 해당 수치가 일정 수준 이상에 도달한다면 사용자수와 1인당 사용 횟수를 함께 보아 사람 수의 유입을 늘릴 것인지 1인당 활동성을 늘릴 것인지 결정할 수 있을 것 같습니다!문제 7. 퍼널 개선 프로젝트input metic의 개념으로 AB테스트를 통해서 온보딩 진행 세그먼트의 가입 퍼널 전환률과 온보딩 미진행 세그먼트의 가입 펀널 전환률을 확인할 것 같습니다. AB테스트를 정한 이유는 어떤 기능의 효과를 가장 명확하게 알아보기 위해서는 모든 다른 조건은 최대한 동일하되 해당 기능만 변수가 되어야 한다고 생각했습니다.이후 output metric으로는 가입 주차별 리텐션을 파악하여 해당 온보딩을 적용한 시점 이후부터의 리텐션이 평탄 혹은 상승하는지를 확인할 수 있을 것 같습니다.