게시글
질문&답변
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
- 112
질문&답변
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
- 112
질문&답변
2024.04.25
copy 모듈 문제
안녕하세요, 이도원입니다. 질문하신 내용보고 IP가 이상하네? 라고 했었는데, 답을 구하셨네요. 추가 질문사항 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 2
- 30
질문&답변
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
- 78
질문&답변
2024.04.23
EntityModel과 ResponseEntity의 차이
안녕하세요, 이도원입니다. 말씀하신 내용처럼 Spring Boot에서는 ResponseEntity를 통해 클라이언트 요청에 대한 결과 데이터와 상태 등을 전달해 줄 수 있으며, EntityModel은 RepresentationModel의 하위 클래스로써, 반환하려는 데이터를 EntityModel로 Wrapping하면 Spring HATEOAS가 자동으로 표준 링크(ex, _self)를 포함시킬 수 있습니다. 추가로, 아래와 같이 POST 방식에서도 EntityModel을 사용하실 수 있습니다. 아래 예제에서는 회원 가입 후, 상세 보기를 하기 위해 URI를 제공하도록 작성되었습니다. (사진) 감사합니다.
- 0
- 2
- 81
질문&답변
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
- 50
질문&답변
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
- 51
질문&답변
2024.04.23
user-service-1.0.jar 파일이 만들어지지 않습니다.
안녕하세요, 이도원입니다. 작업하신 pom.xml 파일로 빌드 시 저희쪽에서도 동일한 오류가 발생하네요. lombok plugin에 문제가 있는 것 같습니다. 아래와 같이 최신 버전으로 변경해서 다시 빌드해 보시면 될 것 같습니다. org.projectlombok lombok 1.18.32 true 감사합니다.
- 0
- 2
- 73
질문&답변
2024.04.15
jwt 인증401 뜹니다.
안녕하세요, 이도원입니다. 말씀하신 내용처럼 authorizationHeader 의 Bearer 토큰과 jwt가 동일한게 맞다면, user-service에서 토큰을 생성할 때 사용한 secret_key가 apigateway-service에서 토큰의 유효성 검사를 위해 사용하는 secret_key가 같은지와 유효시간에 문제가 없는지 등을 확인해 보셔야 합니다. 우선 apigateway-service의 AuthorizationHeaderFilter 클래스의 isJwtValid 메소드에서 디버깅을 해 보시면서, 한 단계식 확인해 보시면 좋을 것 같습니다. (사진) 추가 질문이 있으시면 글 남겨 주세요. 감사합니다.
- 0
- 2
- 91
질문&답변
2024.04.15
로그인 성공 후 어떻게 진행되는지 이해가 안갑니다.
안녕하세요, 이도원입니다. 말씀하신 내용처럼, apigateway-service에서 사용자의 로그인 요청을 받게 되면, user-service로 해당 요청을 보내게 됩니다. user-service에서는 로그인 성공일 경우 successfulAuthentication 메소드에서 Token 생성 된 유효기간 등의 정보를 Http Response Header에 저장해서 apigateway-service로 오게 됩니다. apigateway-servcei 에서 요청 (Http Request)가 전달 되었으니, 응답 (Http Response)도 apigateway-servcei로 가게 된다고 이해하시면 좋을 것 같습니다. 이 작업으로 Login 요청이 끝나게 되면 요청한 클라이언트에게는 Http Response Header에 user-service에 의해 발생 된 토큰이 저장된 것을 확인하실 수 있으며, 이 Token을 다음번 서비스 사용부터 (회원 목록 조회, 상품 조회 등의 비즈니스 메소드) 사용하게 됩니다. apigateway-servcei의 apply 메소드에서는 제일 먼저 처리하는 작업이 사용자의 요청에 Token에 저장되어 있는지 그리고 해당 토큰이 유효한지를 검사하여 해당 요청을 user-service로 전달할지 order-service로 전달할 지 등을 결정하게 됩니다. 말씀하신 질문처럼 user-service의 successfulAuthentication 메소드와 apigateway-service의 apply 메소드는 하나의 동작에서 처리되는 것이 아니라, 각각 분리된 동작이라고 이해하셔야 합니다. 추가 질문 사항이 있으시면 다시 글 남겨 주세요. 감사합니다.
- 0
- 2
- 330