컨버터에 대해서 질문있습니다.
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의를 들어보니까 이미 스프링에서 다 컨버터를 만들어서 제공해주고 있다고 말씀하시는데요 그러면 실무에서 개발자가 직접 코딩할일은 없고 만들어진 컨버터를 사용하기만 하면 되는건가요?? 개발자가 컨버터를 직접만들어서 사용할 경우가 있는지 궁금합니다.
- MVC
- spring
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의를 들어보니까 이미 스프링에서 다 컨버터를 만들어서 제공해주고 있다고 말씀하시는데요 그러면 실무에서 개발자가 직접 코딩할일은 없고 만들어진 컨버터를 사용하기만 하면 되는건가요?? 개발자가 컨버터를 직접만들어서 사용할 경우가 있는지 궁금합니다.
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요. 연관관계 주인이 아닌 List로 구현된 members에서 궁금한 점이 있습니다. 먼저 지금까지 이해한 바로는, @Entity 애노테이션과 ddl-auto 속성에 의해서 @Entity를 가진 클래스의 필드들이 해당 테이블의 attribute로 만들어지는 것으로 이해했습니다. 1. @Column이 DB 테이블의 실제 컬럼 이름과 매핑을 짓는 용도라고 이해했는데 @Column을 생략해도 DB상에 해당 컬럼이 생성된 것을 확인했습니다. 이 경우, 컬럼은 생성됐지만 매핑은 이루어지지 않은건가요? 2. Team 클래스의 members 어레이리스트는 Team 테이블의 attribute로 등록되지 않는 이유가 뭔가요? 물론, 데이터베이스 상에서 하나의 attribute에 하나의 값을 가져야 하는건 맞지만 이게 컬렉션으로 구현된 필드는 JPA에서 자동으로 attribute이 아니라고 인식하는 건가요?
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 제가 이번 강의를 듣고 제 토이 프로젝트에 메세지 처리를 추가 하고 싶어서 Bean Validation을 이용한 검증 코딩을 해봤는데요 @Getter @NoArgsConstructor (access = AccessLevel. PROTECTED ) public class LoginRequest { @NotBlank @Size (min = 2 ) @Email private String email ; @NotBlank @Size (min = 8 , max = 20 ) private String password ; } ------------------------------------------------------------------------------------------------- @Getter @NoArgsConstructor (access = AccessLevel. PROTECTED ) public class UserCreateRequest { @NotBlank @Size (min = 2 ) @Email private String email ; @NotBlank @Size (min = 8 , max = 20 ) private String password ; @NotBlank @Size (min = 2 ) private String name ; } 위와 같이 DTO를 만들고 @PostMapping ( "createUser" ) public Result<UserResponse> createUser ( @RequestBody @Valid UserCreateRequest request) throws NotFoundException { return Result. success ( userService .createUser(request)) ; } 컨트롤러에서 @Valid 어노테이션을 줘서 회원가입을 검증하도록 했습니다. 저는 LoginRequest와 UserCreateRequest의 fieldName이 같고 제약 조건도 거의 똑같다고 생각해서 message 처리를 범용성 있게 하면 좋겠다고 생각했고 그래서 validation-properties를 만들고 그 안에 errorCode + objectName + fieldName 보다는 errorCode + fieldName에 관한 메세지 처리를 했는데요 yml server : port : 8060 spring : application : name : potato-velog-user datasource : url : jdbc:h2:mem:testdb driver-class-name : org . h2 . Driver h2 : console : enabled : true settings : web-allow-others : true path : /h2-console messages : basename : validation encoding : UTF-8 eureka : client : register-with-eureka : true fetch-registry : true service-url : defaultZone : http://localhost:8761/eureka validation-properties NotBlank.email = 이메일을 입력해주세요 . NotBlank.password = 비밀번호를 입력해주세요 . NotBlank.name = 이름을 입력해주세요 Size.email = 이메일은 최소 {0} 글자 이상이어야 합니다 . Size.password = 비밀번호는 최소 {0} 글자 최대 {1} 글자 이하여야 합니다 . Size.name = 이름은 최소 {0} 글자 이상이어야 합니다 . Email = 이메일 형식이어야 합니다 . NotBlank = 공백 안돼요 Size = 사이즈 지키세요 그리고 나서 저는 postMan을 이용해 검증을 시도해 봤는데 { "email" : "aaa@naver.com" , "password" : "11111111" , "name" : "a" } 제가 예상했던건 UserCreateRequest의 name이 Size 조건을 만족하지 못헀기 때문에 Size.name에 관한 메세지(이름은 최소 2글자 이상이어야 합니다) 가 나올거라 생각했는데 Validation failed for argument [0] in public com.velog.veloguser.domain.utils.Result<com.velog.veloguser.domain.dto.response.UserResponse> com.velog.veloguser.controller.UserController.createUser(com.velog.veloguser.domain.dto.request.UserCreateRequest) throws javassist.NotFoundException: [Field error in object 'userCreateRequest' on field 'name': rejected value [a]; codes [Size.userCreateRequest.name,Size.name,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userCreateRequest.name,name]; arguments []; default message [name],2147483647,2]; default message [크기가 2에서 2147483647 사이여야 합니다]] 위와 같이 DefaultMessage가 ' 크기가 2에서 2147483647 사이여야 합니다' 라고 나옵니다. 저는 왜 메세지가 저렇게 나오는지 이해가 안가고 만약 Size.name에 관한 메세지를 찾지 못했더라도 Size = 사이즈 지키세요 라는 메세지가 validation-properties에 있기 때문에 '사이즈 지키세요' 라는 메세지가 출력되었어야 하는거 아닌가요?
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요. 스프링 MVC Part.2 강좌에서 필터와 인터셉터를 배우고나서, 서블릿 필터, 스프링 인터셉터, AOP가 모두 선언이 되어 있는 경우 AOP가 동작하는 시점에 대해 질문을 드리고자 글을 남깁니다. [강의 자료에서 가져온 필터, 인터셉터의 동작 과정] HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 동작 과정을 보다가 문득 든 생각입니다. '그럼 AOP는 어느 구간에서 요청을 캐치해서 동작하는거지?' 예를 들어, 공통 관심 사항(메소드 실행시간 체크)을 처리하는 AOP를 @Around(핵심 기능 실행 전/후 동작)로 선언했다면 AOP가 동작하는 과정은 아래 과정이 맞을까요? HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> AOP -> 컨트롤러 무조건 위 과정이 맞는지 아니면 공통 관심 사항을 적용하는 방법 ( 메소드 실행 전 , 후 , 전 + 후 ) 에 따라 바뀌는지 궁금합니다 .
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요, 로그인 처리2 - 필터, 인터셉터 파트의 'ArgumentResolver' 활용편에서 궁금한 사항이 있어 질문 글을 작성해 봅니다. HomeController에서 '/' URL에 대한 핸들러 메소드 선언시 'member' 파라미터에 대해서는 @Login 어노테이션을 선언하여 직접 구현한 LoginMemberArgumentResolver를 통해 세션에 담긴 로그인 객체를 바인딩(?) 시켜주는 과정을 확인할 수 있었습니다. 만약, HomeController에서 '/' URL 요청 매핑 외 다른 URL 요청 매핑을 처리할 수 있는 여러 핸들러 메소드가 선언되고, 기획자 또는 클라이언트의 요구사항에 따라 HomeController에서 처리되는 모든 핸들러 메소드에 대해서는 로그인 객체를 이용하여 무언가 분기 처리를 해야하는 로직이 포함되어 있어야 한다면(분기 처리는 각기 다른 로직을 포함하고 있습니다.) HomeController에 존재하는 모든 핸들러 메소드의 파라미터로 '@Login Member member'가 선언이 되어야 할 것 같다라는 생각이 들었습니다. 이 또한 반복적인 코드가 아닐까 싶은데요. HomeController에서 ' 전역적 '으로 로그인 정보를 포함하고 있는 객체를 선언하고, 이를 핸들러 파라미터로 굳이 선언하지 않아도, 각 핸들러 메소드에서 사용할 수 있는 방법이 있을까요? P.S HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 흐름을 생각해 보면... 서블릿 필터 또는 인터셉터를 통해 매 요청에 세션에 담긴 로그인 정보를 핸들러 메소드에 각각 다시 주입(?) 시켜줘야 할 것 같은데 실무에서 보통 이렇게 처리하는지 아니면 다른 방법이 있는지 궁금합니다. 미리 답변 감사드립니다 .
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
id는 css나 javascript에서 HTML element를 특정할 때 사용하는 거잖아요? 단일 css 파일이나 js 파일을 쓴다고 가정한다면 어플리케이션 전체 html 상에서 그 id는 유일성이 보장되어야지 나중에 화면이 꼬이거나 javascript가 꼬이거나 하는 일이 없을 거 같거든요. 만약 퍼블리셔나 프론트엔드 개발자가 A form에서는 <input id="itemNameA" > B form에서는 <input id="itemNameB"> 라고 잡아놓고 퍼블리싱이나 클라이언트 쪽 개발을 했다면, 나중에 백엔드 개발자가 A form에는 <form th:object = "${itemA}"> <input id="itemNameA" th:field="*{itemName}"> </form> B form에는 <form th:object = "${itemB}"> <input id="itemNameB" th:field="*{itemName}"> </form> 이렇게 해버리면 id를 서로 다른 DTO의 같은 필드명을 사용해버려서 문제가 생길 것 같은데요. 그런데 타임리프 개발자들이 id랑 name 모두 바뀌도록 설정해놓은 것은 무언가 깊은 뜻이 있어서일 것 같은데, 제가 생각하는 문제가 일어날 가능성이 없는 건가요? 제가 무언가 잘못 이해하고 있는 건가요?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강사님 Order클래스에서 연관관계 메서드를 만드실 때 Member에 대한 연관관계 메서드의 경우 public void setMember(Member member)라고 하셨는데 그 이전에 lombok으로 이미 setter를 만들어 주셨는데 그렇게 되면 lombok으로 만든 setter는 연관관계 메서드에 의해 무시가 되는건가요?
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원 등록시 html form에는 action="/members/new"로 되어있는데 < form role ="form" action ="/members/new" th:object ="${memberForm}" method ="post" > --- 새로운 아이템 등록시 html form에는 action="@{/items/movie/new}"로 되어있습니다. < form th:action ="@{/items/movie/new}" th:object ="${form}" method ="post" > 이 '{@"" }'의 차이가 뭔지 왜 빼거나 넣으면 작동이 안되는지 이유와 역활을 알려주시면 감사하겠습니다.
미해결
실전! 스프링 데이터 JPA
페이징하면 제일 먼저 생각나는게 영한님이 말씀하신것 처럼 게시판의 페이징 기능이 생각이 납니다. Member가 m1~m5까지 있을때 이름, 나이 m1 AAA 10 m2 BBB 10 m3 CCC 10 m4 DDD 10 m5 EEE 10 이렇게 나이는 동일하고 이름만 다른 조건이 있다고 했을 경우 강의에서 offset과 limit을 활용하여 3개씩 잘라서 1 page = m1,m2,m3 2page = m4,m5 이렇게 나누는것 까지는 잘 이해가 됐습니다. 하지만 이때 totalCount는 강의내용을 참고하면 age가 같은 사람의 개수이니 5 라는 숫자가 나오게 되는데요 이 totalCount는 어디서 쓰이는건가요? 제가 생각하는 페이징에는 offset과 limit만 있어도 게시글 다음페이지 이런걸 할 수 있을거 같은데 어디서 쓰이는지 궁금합니다 ㅎㅎ
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 강사님! 다대다 강의를 보던 중, 다대다를 일대다-다대일 관계로 풀어내고, 연결테이블을 엔티티로 승격하라고 하셨습니다. 여기서, 연결테이블의 PK를 의미없는 값이 아닌, (member_id, product_id)로 가져가게 된다면 em.find(Order.class, [ A ]) 위 메서드를 사용할 수 없고 JPQL을 통해 조회를 해야하나요?? 그렇지 않고 find를 사용할 수 있다면 [ A ] 부분에 어떻게 들어가야하는지 문득 궁금해져서 질문 드립니다!
해결됨
자바 ORM 표준 JPA 프로그래밍 - 기본편
언제나 좋은 강의 감사합니다 영한님! 4분 20초쯤 @JoinColumn 을 넣지 않으면 default 값이 들어가는데 default 값이 지저분해서 넣어주는 것을 권장한다 라고 말씀하셨는데, default값을 확인해보고 싶어서 넣지 않아봤더니 Member 테이블에 LOCKER_ID 라는 컬럼이 추가되는 것을 확인하였습니다. 영상에서의 하이버네이트 버전과 제가 쓰는 하이버네이트 버전이 달라서인지는 모르겠지만 굉장히 직관적인 이름처럼 보이는데 생략하고 사용해도 상관이없을지, 아니면 다른 부분에서 문제가 될 만한 부분이 있는건지 궁금합니다.
해결됨
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요. ddl 속성 통해서 스키마 자동 생성하는 부분에서 이해가 안되는 부분이 있어서 질문드립니다. 이전 강의까지의 예제에서 ddl 설정값을 주석처리했는데도 h2 콘솔상에서 member 테이블이 생성되고 데이터가 삽입된 것을 확인했습니다. ddl-auto 속성값을 none 또는 주석처리해도 @Entity 애노테이션을 기준으로 알아서 테이블을 만들어주는 건가요? 만약 그렇다면, 운영서버에서 자동 생성을 사용하지 말아야한다고 하셨는데 @Entity 애노테이션을 통해 자동으로 테이블이 생성되는 것을 어떻게 막을 수 있나요??
미해결
실전! Querydsl
안녕하세요 강의 잘 듣고 있습니다!^^ 벌크 연산 수행후 영속성 컨텍스트와 DB의 값이 달라지기 때문에 em.flush( ), em.clear( ) 를 해주면 된다고 하셨는데 이미 DB에는 값이 저장 되었는데 flush( )를 해주는 이유가 있을까요? clear( )만 해주면 안되나요?
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
영한님이 조언해주신 것 처럼 Spring data jpa 익히기 전에 JPA 먼저 제대로 숙지하고 넘어가고자 하는데요. 강의에서 빠른 수업 진행을 위해 간략히 구성한것들 full로 구현해보는 것 외에 추가적으로 학습하기 좋은 방법이 잇을까요? 개인적으로 공부하는거라 실무에 적용해 볼수가 없어 질문드립니다. 답변주시면 감사드리겠습니다.
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 잘 듣고 있습니다. 저는 ENUM을 GUEST("USER000"), USER("USER010"), ADMIN("USER020"); 와 같이 사용하고 DB에는 "USER000"과 같은 코드 값을 저장합니다. 혹시 EnumType.STRING에서 저 코드 값을 DB에 넣도록 할 수 있을까요? toString()을 오버라이드 하면 가능 한지 궁금합니다.
해결됨
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요. 서블릿 필터 - 소개 강의 내용 4:45 부분에서 '웹과 관련된 공통 관심사는 AOP보다 서블릿 필터 또는 스프링 인터셉터를 이용하는 것이 좋다.' 라는 말씀을 언급해 주셨는데요. 스프링 입문 강의 파트에서 AOP에 대해서 맛보기로 다룰 때 예제 코드에서는 특정 메소드의 실행 시간을 출력해 보는 용도로써 AOP 기술을 사용해 본 적이 있습니다. 여기서 궁금한 것은 실무에서. 물론 규모에 따라 다르겠지만, 보편적으로 웹과 관련된 공통 관심사를 서블릿 필터와 스프링 인터셉터로 구현했다면 AOP 를 사용하여 구현할 공통 관심사항에는 메소드 실행시간 외 어떤 것들이 있는지 궁금합니다 . 미리 답변 감사드립니다.
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원등록 V2 방식을 그대로 사용하고 POSTMAN에서 POST방식으로 BODY안에 CreateMemberRequest 클래스의 필드와 같은값으로 데이터를 전송해봤습니다. 그런데 기본생성자가 없을경우에는 "org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jpashops.ormonetwocombine.dto.RequestItemDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jpashops.ormonetwocombine.dto.RequestItemDto` 포스트맨 에러입니다 이런 에러 구문이 나오더군요, 그런데 기본생성자를 CreateMemberRequest에 추가해주고 다시 Postman으로 전송하더니 잘되더군요, 받아온 JSON 데이터를 파싱하는데 기본생성자가 원래 필수인가요~?
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
package mvcStructure.basic.request ; import lombok.extern.slf4j. Slf4j ; import org.springframework.stereotype. Controller ; import org.springframework.web.bind.annotation. RequestMapping ; import org.springframework.web.bind.annotation. RequestParam ; import org.springframework.web.bind.annotation. ResponseBody ; import javax.servlet.http.HttpServletRequest ; import javax.servlet.http.HttpServletResponse ; import java.io.IOException ; @Slf4j @Controller public class RequestParamController { @RequestMapping ( "/request-param-v1" ) public void requestParamV1 (HttpServletRequest request , HttpServletResponse response) throws IOException { String username = request.getParameter( "username" ) ; int age = Integer. parseInt (request.getParameter( "age" )) ; response.getWriter().write( "ok" ) ; } @ResponseBody @RequestMapping ( "/request-param-v3" ) public String requestParamV3 ( @RequestParam String username , @RequestParam String age){ log .info( "username = {}, age = {}" , username , age) ; return "ok" ; } //@RequestParam 생략하고 단순 타입이면 자동으로 RequestParam 이라고 요청 파라미터라고 인식한다 @ResponseBody @RequestMapping ( "/request-param-v4" ) public String requestParamV34 ( String username , String age){ log .info( "username = {}, age = {}" , username , age) ; return "ok" ; } @ResponseBody @RequestMapping ( "/request-param-Required" ) public String requestParamRequired ( @RequestParam (required = true ) String username , @RequestParam (required = false ) Integer age){ log .info( "username = {}, age = {}" , username , age) ; return "ok" ; } } 현재소스이고 경로는 아래와 같이 했습닌다 =========================================== properties속성은 아래와 같습니다 ============================ #mvcStructure.~~ 패키지와 그 하위 로그레벨 설정 logging.level.root = info logging.level.hello.springmvc = debug ============================== 현재 접속하면 whitepage가 나는건 왜그런가요
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요, 선생님. 강의를 듣고 이제 첫 실전에 jpa를 사용하는데 Entity 설계 과정에 어려움이 있어서 질문드립니다. 다름이 아니라 제가 스프링 시큐리와 같이 회원과 권한의 테이블을 설계하려고 해서 조사를 해보니 https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/User.java https://github.com/zidol/springsecurity_jwt_mysql/blob/main/src/main/java/co/kr/nakdong/entity/author/Authority.java 와 같은 구조 혹은 @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "user_role" , joinColumns = @JoinColumn(name = "user_id" ), inverseJoinColumns = @JoinColumn(name = "role_id" )) private Set < Role > roles; 다대다 구조를 많이 사용하더라구요.. 위 코드의 User 와 Authority는 일대다 구조인데 강의때 배울때 연관관계 주인 설정이나 fetch 타입 설정이 다르고 일대다는 권장 하지 않으셔서 조금 혼동이 오더라구요.. 지 양하라는 말씀을 그대로 쓰는코드들도 꽤 있더라구요. 그래서 최대한 강의때 배운데로 해보려고 아래 스샷처럼 변경 해보았습니다. 위 ERD 이미지 처럼 Entity를 변경해보았습니다.(테이블명은 작업중이라 안맞습니다.) 로그인 시 User객체를 조회 하여 불러오는데 test 코드에서 UserRepository를 통해서 User를 불러오면 데이터를 잘 조회 합니다. 제가 로그인을 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication메소드를 재구현했는데 리턴하는 부분에서 could not initialize proxy - no Session 에러가발생하네요.. @SneakyThrows @Override public Authentication attemptAuthentication ( HttpServletRequest request , HttpServletResponse response ) throws AuthenticationException { UserLoginDto userLogin = objectMapper . readValue ( request . getInputStream (), UserLoginDto . class ); String requestURI = request . getRequestURI (); if ( userLogin . getRefreshToken () == null ) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken ( userLogin . getUsername (), userLogin . getPassword (), null ); // 에러 발생부분 return authenticationManager . authenticate ( token ); } 제가 뭘 잘못하고 있는지, 어떤걸 참고해야 하는지 알려주시면 알될까요?? 감사합니다. 좋은 하루되세요
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
현재 error-401치고 들어가면 강의대로라면 4xx 오류 화면 ~~~라고 떠야되는데 404로 뜨고 있는 현상입니다. 왜 그런지 알 수 있을까요?? 현재 ServletExController에 /error-401이 등록되어 있지 않아서 그런건가요?? 만약에 그렇다면 강의에서 404이외에 4xx대의 URL은 4xx.html이 뜬다고 말씀해주셨는데 이해가 되지 않습니다.