게시글
질문&답변
2024.04.30
"섹션3. 다국어 처리를 위한 Internationalization 구현 방법" 관련 문의드립니다.
안녕하세요, 이도원입니다. 말씀하신 것처럼 Accept-Language 설정을 required=false로 설정 하였기 때문에, 클라이언트에서 요청할 때 해당 헤더가 없으면 기본값으로 사용되어야 하는 것이 맞습니다. 다만, 사용하시는(테스트하는) Tools에 따라서 이러한 값이 다르게 전달 될 수도 있습니다. 예를 들어 Postman에서는 Accept-Language 값을 사용자가 지정하지 않았을 경우에도 정상적으로 Locale 값이 null로 설정되어 사용될 수 있는 반면에 Talend와 Tool에서는 Accept-Language 값이 없을 경우 Locale 형태가 아니라 String 값으로 기본값이 설정되어 전달 됩니다. 따라서, 예제에서 실행 메소드는 Parameter의 인자값 형태가 달라서 실행되지 않습니다. 아래 예제처럼 RequestHeader를 String으로 전달 받을 수 있는 메소드를 등록하신 다면, Talend에서 Accept-Language 값을 전달하지 않을 때에도 정상적으로 실행되는 것을 보실 수 있습니다. @GetMapping(path = "/hello-world-internationalized") public String helloWorldInternationalized( @RequestHeader(name="Accept-Language", required=false) Locale locale, HttpServletRequest req) { return messageSource.getMessage("greeting.message", null, locale); } @GetMapping(path = "/hello-world-internationalized2") public String helloWorldInternationalized2( @RequestHeader(name="Accept-Language", required=false) String locale, HttpServletRequest req) { return messageSource.getMessage("greeting.message", null, new Locale(locale)); } (사진) 따라서 예제에서 사용한 Locale 값으로 인해 기본값이 전달되지 않았던 것 같습니다. 이 부분을 String으로 변경해서 사용해 보시면, Accept-Language 값을 전달하지 않아도 예제가 실행되실 것 같습니다. 감사합니다.
- 0
- 2
- 35
질문&답변
2024.04.30
안녕하세요 질문이 있습니다.
안녕하세요, 이도원입니다. MSA에서 분산 처리되어 저장 된 데이터에 대해서 동기화 하는 다양한 방법 중에 한가지인 MQ를 이용한 방법에 대해서 강의에서 소개하였습니다. MQ에 메시지를 전송하는 쪽은 메시지를 사용하는 쪽에 관심을 두지 않고 오로지 전송하는 쪽에만 관심을 두고 역할을 하게 될 것이며, 메시지를 소비하는 쪽은 보낸 쪽과는 상관없이 MQ에 저장된 메시지를 인식하고 메시지의 규격이 자신이 이해하는 형태와 동일하면 해당 메시지를 사용하게 될 것입니다. 이렇게 책임의 분할을 통해 의존성을 낮출 수 있고 성능도 좋아지게 될 것입니다. 문의하신 내용 중에 DB에서의 조회를 어떻게 하느냐에 대한 부분은, 일단 MQ에 저장 된 메시지를 사용하려는 소비자(Consumer) 측에서는 이벤트에 의해 메시지가 생성 되었음을 인식하고(구독 방식이 많이 사용 됩니다) 해당 메시지를 DB에 업데이트 하게 됩니다. 조회 요청이 들어 왔을 때 메시지를 가져가는 것이 아니라, 사전에 일정한 주기나 메시지 저장 이벤트 등에 의해 MQ로부터 메시지를 가져와서 DB에 반영하게 됩니다. 이러한 작업을 위해서는 말씀하신대로 애플리케이션에서 메시지 수신을 위한 이벤트 처리가 반영되어 있어야 할 것이고, Spring Boot에서는 Spring Kafka에서 제공하는 @Listenere 과 같은 어노테이션을 통해 처리할 수 있습니다. MQ와 DB와 같은 스토리지 간에 데이터 동기화는 이렇게 프로그래밍적인 방식고 가능하고, 강의에서도 소개한 Kafka Connect와 같은 서비스나 다른 동기화 매커니즘 등을 통해서도 가능합니다. 추가 질문사항 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 1
- 45
질문&답변
2024.04.26
앤서블 컨테이너 생성에서 어려움을 겪고 있습니다.
안녕하세요, 이도원입니다. 말씀하신 Ubuntu 환경에서 Dind 방식의 Docker가 실행 될 수 있도록 이미지 등록했습니다. 이미지 환경은 아래와 같습니다. AWS EC2 Ubuntu 22.04 + Docker 26.1.0 환경에어 도커 이미지 생성 했습니다. edowon0623/ubuntu-server:ubuntu22.04 --> Ubuntu 22.04 설치 edowon0623/sshd-server:ubuntu22.04 --> Ubuntu 22.04 + sshd 설치 edowon0623/docker-server:ubuntu22.04 --> Ubuntu 22.04 + sshd + Docker edowon0623/ansible-server:ubuntu22.04 --> Ubuntu 22.04 + sshd + Docker + Ansible 설치 참고로 sshd 서버에 접속 시 암호는 P@ssw0rd 로 앞서 다른 환경과 동일합니다. 해당 이미지는 Ubuntu OS가 설치 된 환경에 Docker를 먼저 설치하시고 위 이미지들을 docker pull 하셔서 사용하시면 됩니다. 실행 해 보시고 문의사항 있으시면 다시 글 남겨 주시기 바랍니다. 감사합니다.
- 0
- 3
- 138
질문&답변
2024.04.25
앤서블 컨테이너 생성에서 어려움을 겪고 있습니다.
안녕하세요, 이도원입니다. 답변이 늦어 죄송합니다. AI 인턴 답변이 달려 있어, 미쳐 꼼꼼하게 확인하지 못했습니다. 문의사항 내용은 Ubuntu 환경에서 제공해 드린 ansible 이미지를 사용하려고 했을 때 오류가 발생하는 문제점인 것 같습니다. 저희가 제공해 드리는 ansible 이미지가 Centos에서 작성된 이미지이기 때문에, Linux에 설치 된 Docker Engine에 따라 다르게 실행될 수 있을 것 같습니다. 확인해 보니, Centos 에서 실행할 때에는 해당 ansible 이미지가 문제가 없는 것 같습니다만, Ubuntu 에서는 올려주신 문제와 같은 오류가 있음을 확인했습니다. Ubuntu에서 실행 가능한 이미지 (ubuntn + docker + ansible)를 생성하는 데로 다시 공유해 드리도록 하겠습니다. 추가로, 저희가 강의에서 docker를 사용하는 목적은 CI/CD 테스트를 하는데 있어, 여러 VM이 필요로 하는 경우가 있는데, VirutalBox와 같은 툴이 Windows나 MacOS Intel chip 경우에는 잘 작동되지만, M1 chip을 사용하는 MacOS의 경우에는 VirutalBox를 사용할 수 없어서, docker in docker 방식으로 VM을 설치하고 해당 VM에 docker가 설치 되어 있는 것처럼 꾸며서 실습환경을 구성해 보았습니다. 그런데, 다양한 환경에서 DinD 방식으로 실행하는데에 문제점이라던가 SSH 서버가 기동되지 않는 등의 이슈로 인해 별도의 VM 관련 강의를 제작하여 공유해 드렸습니다. 이 때는 MacOS M1 에서도 사용 가능한 VM 서비스에 대한 부분도 추가하긴 했습니다. 결론 부터 말씀드리면, 일반적인 VM 환경에 OS와 Docker + SSH를 설치하는데에 큰 문제가 없다면, 굳이 강의에서 사용한것과 같은 DinD 방식의 Docker는 사용하지 않는 게 좋다고 생각됩니다. VM을 구성하신 후에는 OS를 설치한 상태에서 추가로 Ansible과 Docker를 각 OS에 맞춰 설치해서 환경을 구축하신다면, 강의에서 사용하는 예제는 모두 실행가능합니다. 내용이 길어졌는데, 요약하면, Ubuntu에서 사용할 수 있는 Dind 이미지 (ubuntu + docker + ansible + ssh)는 작업 되는 대로 공유 예정 VM 환경 구축이 가능하시다면 Dind 이미지 사용하는 것 대신, Linux VM에 직접 Docker + Ansible _ SSH 설치 이렇게 될 것 같네요. 추가 질문 사항 있으시면 다시 글 남겨 주세요. 가능한 빠른 답변 드리도록 하겠습니다. 감사합니다.
- 0
- 3
- 138
질문&답변
2024.04.25
copy 모듈 문제
안녕하세요, 이도원입니다. 질문하신 내용보고 IP가 이상하네? 라고 했었는데, 답을 구하셨네요. 추가 질문사항 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 2
- 54
질문&답변
2024.04.23
JPA를 이용한 개별 사용자 상세 조회 5분 21초
안녕하세요, 이도원입니다. 답변이 늦어 죄송합니다. Response Body에 전달 되는 데이터는 ResponseEntity로 반환 시 Bean(User.class 등)에 대한 모든 정보가 반환 되게 하지 않고 Filter를 통해 반환 하고자 하는 값들을 제어 할 수 있습니다. 아래 코드처럼 SImpleBeanPropertyFilter를 사용하시거나, User 클래스의 Proeprty에 @JsonIgnore를 명시적으로 표시해서 전달하지 않을 수 있습니다. 테스트하신 코드를 보지 못해 작업하신 결과의 정확한 과정은 파악하기 어려우나, 강의에서도 AdminUserController등을 생성해서 Response Body에 전달하는 값들을 제어하고 있습니다. SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter .filterOutAllExcept("id", "name", "joinDate", "ssn"); FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter); // @JsonIgnore @Schema(title = "비밀번호", description = "사용자의 비밀번호를 입력해 주세요.") private String password; // @JsonIgnore @Schema(title = "주민번호", description = "사용자의 주민번호를 입력해 주세요.") private String ssn; 추가로 _links 값은 SPring HATEOAS 기능을 통해 하이퍼미디어 URI가 자동으로 생성되게 매핑된 데이터입니다. 추가 질문사항 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 2
- 82
질문&답변
2024.04.23
EntityModel과 ResponseEntity의 차이
안녕하세요, 이도원입니다. 말씀하신 내용처럼 Spring Boot에서는 ResponseEntity를 통해 클라이언트 요청에 대한 결과 데이터와 상태 등을 전달해 줄 수 있으며, EntityModel은 RepresentationModel의 하위 클래스로써, 반환하려는 데이터를 EntityModel로 Wrapping하면 Spring HATEOAS가 자동으로 표준 링크(ex, _self)를 포함시킬 수 있습니다. 추가로, 아래와 같이 POST 방식에서도 EntityModel을 사용하실 수 있습니다. 아래 예제에서는 회원 가입 후, 상세 보기를 하기 위해 URI를 제공하도록 작성되었습니다. (사진) 감사합니다.
- 0
- 2
- 93
질문&답변
2024.04.23
직접 생성하지 않은 주소가 생성되어 있습니다.
안녕하세요, 이도원입니다. Spring Boot와 Spring HATEOAS를 사용하여 개발된 RESTful API에서 응답 본문의 links 부분은 Spring HATEOAS 프레임워크에 의해 자동으로 생성됩니다. HATEOAS에서는 하이퍼미디어 기반 출력 데이터를 쉽게 생성할 수 있습니다. 또한, Spring HATEOAS에서는 self, next, previous와 같은 링크를 응답 데이터에 자동으로 추가할 수 있기 때문에, 개발자가 직접 URI를 하드코딩하지 않고도 API를 동적으로 탐색하는 방법을 제공할 수 있게 됩니다. 말씀드린, Spring HATEOAS는 응답에 자동으로 링크를 추가할 수 있는 여러 클래스와 메소드를 제공(RepresentationModel, EntityModel, WebMvcLinkBuilder 등)하고 있으며, 해당 API를 통해 개발자가 직접 하이퍼미디어 데이터를 추가하는 것도 가능합니다. 말씀하신 API들은 HATEOAS에 의해 자동생성 된 부분으로 보시면 될 것 같습니다. 추가 질문 사항 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 2
- 56
질문&답변
2024.04.23
spring boot 3.0 이후 handleMethodArgumentNotValid 메소드
안녕하세요, 이도원입니다. 작업하신 내용을 보면, handleMethodArgumentNotValidException 메소드에서 처리하려고 하는 예외가 BindException인데, ResponseEntityExceptionHandler 클래스에 이미 handleMethodAtgumentNotvalid 메소드의 인자로 사용되는 MethodArgumentNotValidException 가 이미 BindException을 상속 받아 구현되었기 때문에, 동일 한 두개의 핸들러가 존재하지 못한는 오류 인 것 같습니다. 아래와 같은 코드 형태라고 하면, 구현하신 handleMethodArgumentNotValidException 메소드는 삭제하시고, handleMethodAtgumentNotvalid 메소드를 재정의해서 BindException을 처리하게 해 보시면 될 것 같습니다. @ExceptionHandler(BindException.class) public final ResponseEntity handleMethodArgumentNotValidException(BindException ex) { ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage() , ex.getBindingResult().toString()); // 클라이언트에게 상세정보 안보여주도록 false return new ResponseEntity (exceptionResponse, HttpStatus.NOT_FOUND); } @Override protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) { ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), "Validation Failed", ex.getBindingResult().toString()); return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST); } 감사합니다.
- 0
- 2
- 67
질문&답변
2024.04.23
user-service-1.0.jar 파일이 만들어지지 않습니다.
안녕하세요, 이도원입니다. 작업하신 pom.xml 파일로 빌드 시 저희쪽에서도 동일한 오류가 발생하네요. lombok plugin에 문제가 있는 것 같습니다. 아래와 같이 최신 버전으로 변경해서 다시 빌드해 보시면 될 것 같습니다. org.projectlombok lombok 1.18.32 true 감사합니다.
- 0
- 2
- 91