묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결문과생도, 비전공자도, 누구나 배울 수 있는 파이썬(Python)!
파이참 또는 비주얼스튜디오 사용시 문제가 있을까요?
안녕하세요.좋은 강의 마련해주셔서 감사합니다. 다름이 아니라 저는 주식퀀트로드맵 전체를 수강할 계획을 가지고 있는데요, 주피터노트북을 사용하지 않는 경우 따라가기 어려운 부분이 있을까요?제가 파이참이나 비주얼스튜디오코드가 조금이나마 더 익숙한 툴이라 여쭙습니다!
-
해결됨실전 연습으로 익히는 고급 타입스크립트 기술
Object 타입 변형 > Object를 Tuple로 변형 관련 질문드려요!!
Object를 Tuple로 변형관련해서 단계별로 말씀을 해주셨는데요..!Values의 key를 반복문을 돌려서 Tuple로 만들어주는부분까지는 이해가 됐는데type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; }; 다음 [keyof Values]를 해주는 부분에 대한 설명을 조금더 자세히 해주실수있을까 싶어서 문의드렸습니다!!type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; }[keyof Values];
-
미해결[게임 프로그래머 도약반] DirectX11 입문
비쥬얼스튜디오에서 디버그할땐 실행되는대 exe파일로는 실행이안되요
1.실행파일로 시작했을때 오류2.비쥬얼스튜디오에서 디버그 했을때 모습제가 잘못한건지 보려고 선생님 프레임워크 실행해봐도 똑같은 문제가 납니다장치 생성하는 라인인거같은대 왜다른걸까요..?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우에서 cmd로 build시 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.처음 gradlew.bat 명령어는 성공적으로 실행되었으나 gradlew build 명령어 입력시 오류가 납니다..찾아보니 자바의 버전이 다르다고 하는데 cmd에서 java -version해보면 11버전 나오구요build.gradle에서도 11로 되어있습니다 그외 문제가 되는 사항 모두 사진으로도 첨부해놨듯이 버전 11로 되어있는데 어디서 오류가 나는걸까요 ..
-
미해결
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 어노테이션 적용 시 적어뒀던 메시지를 띄우는 걸까요 .. ?전체적인 로직을 제가 맞게 이해한건지 잘 모르겠어서요 ..