안녕하세요. API 서버 구현 - 1 의 내용에 대해서 질문 드립니다. package com.library.service; import com.library.controller.response.PageResult; import com.library.controller.response.SearchResponse; import문을 보면 BookQueryService 와 BookRepository 가 controller 패키지의 DTO들을 의존하고 있습니다. 3-tier architecture 에서는 한 방향으로 의존 관계가 흘러야 한다고 알고 있는데, 아키텍쳐 부분에 대해서 의견을 듣고 싶습니다. 감사합니다.
안녕하세요 2일동안 강의 달리면서 실습도 하면서 궁금증을 해소하기위해 달려온 잡부개발자입니다 최근 일반 레이어드 아키텍처로만 개발을 진행하니 생긴 문제들(테스트진행이 어려워짐, 소스파악하기 어려워짐 등등)이 생겨서 다른 아키텍처가 있나...찾아보다가 헥사고날 아키텍처가 가장 괜찮았다고 생각했고 DDD 형태로 진행하는게 깔끔할꺼같아서 혼자서 구조를 만들어보았어요 아래 설명을 이어붙히도록하겠습니다 adapter ㄴ 헥사고날중 가장 바깥에 존재하는 controller, dao 부분 adapter-model ㄴ adapter 에 쓰이는 모델들을 application 모듈과 연동시키기 위해 만든 model 클래스 모듈 application ㄴ 각각의 UseCase 구현체와 인터펭이스가 존재하며 adapter-model 을 domain 객체로 변경하는 역할도 가진 모듈 domain ㄴ 실제로 비즈니스로직을 가질수있는 POJO 도메인 객체 위 구조는 Aggregate 를 적용하지않았기때문에 향후 각각의 작은 서버로 구성할수있는 MSA 로 뺄수있는 구조는 아니에요 다만 그건 aggregate 모듈을 만들어서 빼면 되는거라 생각하는데 그것보다도 가장 궁금한점은..... 비즈니스 로직을 POJO 객체가 있는 domain 모듈로 파싱할때 JPA 기준 A 라는 유저가 가지고있는 게임플레이 히스토리들도 가지고있잖아요? 이건 POJO 객체로 가져올때 히스토리 객체들도 모두 가지고와서 POJO 내에 넣어야하나요? 반대의 경우 히스토리에서는 유저객체를 들고있을텐데 이때 의존을 모두 가져와야하나요? 아니면 유저의 키값만 객체로 들고있으면될까요? 만약 해당 유저가 한시간에 1000번의 게임을 했다고 가정하면 몇일만 조회해도 엄청 많은 데이터가 램으로 올라가기때문에 좀 부담스러운데 히스토리가 필요한경우 쿼리에 비즈니스로직을 담아 타협해야하나요? 물론 드라마틱한 성능차이가 없다면 도메인에서 처리해도되겠지만 성능상 차이가 많이 난다면 쿼리에 비즈니르로직을 담아야하는게 아닌가싶어서요 글이 좀 생각의 흐름대로 쓰인거같아 미리 죄송합니다 ㅠ
백엔드 단에서 어떤 아키텍처 속에서 데이터가 흐르는지 궁금해져서 찾아보고 있습니다. 예를 들면 저는 이때까지 클라이언트 - 서버 - 웹서버 - DB 이 구조만 알고 있었거든요.. 근데 현업에선 좀 더 복잡하고 그 아키텍처를 이루기 위해 다루는 툴들도 다양하더라고요... 전 그 부분이 많이 약한 것 같아서 아키텍처 위주로 책이나 강의 찾아보고 있는데 아키텍처 책이나 강의 중 어떤걸 우선적으로 선택해서 공부를 시작해야 하나 고민이 되어서.. 이렇게 문의 글을 남깁니다.. ㅠㅠ 전 이쪽으론 완전 초보 입니다! 유튜브를 통해서 짧게 나마 익힌 건.. 검색 엔진을 위해서는 elasticsearch를 사용하고 DB 과부화 막기 위해선 redis를 사용한다.. 뭐 이런 내용을 봤는데 저는 좀 더 전체적인 그림을 보고 싶습니다.. ㅠㅠ
클린 아키텍처 (및 헥사고날) 설계 시 JPA 영속성 계층을 어디에 두어야하는지 궁금합니다. 일반적으로 해당 아키텍처에선 영속성 계층을 도메인 계층에서 분리시켜야 한다고 주장하던데 (육각형 안 Entity는 POJO이며, JPA Entity는 바깥의 Adapter에 구현하고 Mapper로 변환하는 형식), 이렇게 되면 JPA가 제공하는 lazy loading이나dirty checking 등의 이점은 포기해야 되는것일까요? 도메인 모델에 JPA 코드를 사용하자니 이러한 아키텍트 원칙에 위배되는거 같고, 그렇다고 이걸 분리해놓으면 따로 구현해야될게 많아지니 고민입니다.. 타협을 한다면 어느 방식으로 하는게 좋을까요? 애초에 이러한 아키텍트 방식과 JPA는 (지향점이 다르기에) 어울리지 않는 것일까요?
안녕하세요. 스프링시큐리티 로그인관련 진행하다가 extends webSecurityConfigurerAdapter 가 취소선이 나와서 확인해보니 현재는 사용하지않는다고 알게되었습니다. 나름 바꾸면서 진행중인데 authenticationManager() 를 사용하려면 어떻게해야되는지 알 수 있을까요?
Spring Boot 3.XX 대 버전으로 최신 버전 사용 시 H2를 이전 버전으로 사용 불가합니다. 따라서 H2를 따로 켜서 실행해준 후, catalog-service에서 Server mode로 연결하던지 따로 켜 둔 H2를 연결하던지 선택해야합니다. 이 때, Server Mode로 프로젝트와 H2를 연결시키면 강의 내용의 설정만으로는 data.sql의 INSERT 쿼리문이 동작하지 않습니다. 그렇기 때문에 관련 설정을 application.yml에 추가해주어야 하는데요. 아래와 같이 설정하면 됩니다. stackoverflow와 강사님의 2021년 답변을 참고하여 해결하였습니다. server: port: 0 spring: application: name: catalog-service h2: console: enabled: true settings: web-allow-others: true path: /h2-console datasource: driver-class-name: org.h2.Driver url: jdbc:h2:tcp://localhost/mem:testdb username: sa jpa: hibernate: ddl-auto: create-drop show-sql: true generate-ddl: true defer-datasource-initialization: true sql: init: mode: always eureka: instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka logging: level: com.example.catalogservice: DEBUG 추가한 내용은 spring.jpa.defer-datasource-initialization과 spring.sql.init.mode 설정입니다.
안녕하세요. 강의 잘듣고 있습니다. 다만, 제가 이 강의부터 시작해서 그런지 용어에 대한 개념이 헷갈립니다. util 디렉토리와 source.kt 파일의 역할은 정확히 무엇인가요? util 디렉토리에 들어가는 파일들의 내용은 무엇이고, DataSource의 역할이 무엇인지 궁금합니다 ! 감사합니다..
최신 버전 진행하시는 분들을 위해 공유드립니다. Spring Security Configuration 설정 내용이 변경되었습니다. WebSecurityConfigurerAdapter 클래스가 deprecated되었는데요. 해당 클래스를 상속 받아 config 메소드를 구현하는 대신 SecurityFilterChain을 반환하고 직접 Bean으로 등록하도록 설정 방법이 바뀌었습니다. package com.example.userservice.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurity { private static final String[] WHITE_LIST = { "/users/**", "/**" }; @Bean protected SecurityFilterChain config(HttpSecurity http) throws Exception { http.csrf().disable(); http.headers().frameOptions().disable(); http.authorizeHttpRequests(authorize -> authorize .requestMatchers(WHITE_LIST).permitAll()); return http.build(); } } 강의 내용을 진행하기 위해서 강의에 나온 설정을 위처럼 설정해보았는데요. 일단 이렇게 설정하면 강의를 진행하는데 문제 없을 것이니 참고 바랍니다~
Error: Could not find or load main class org.apache.kafka.connect.cli.ConnectDistributed Caused by: java.lang.ClassNotFoundException: org.apache.kafka.connect.cli.ConnectDistributed kafka connect 설정도중 위의 에러가 해결되지 않아 통합 파일을 받으려했는데 페이지를 찾을 수 없다고 나옵니다. https://www.inflearn.com/questions/601451/windows-kafka-%EC%A0%95%EC%83%81-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94-%EB%B2%84%EC%A0%84-%EC%A0%9C%EA%B3%B5%EB%AC%B8%EC%9D%98 https://drive.google.com/file/d/1GDrBskzAE4Y_GojNeXhGeN2YeMFrpFe-/view?usp=sharing 링크 공유 다시해주시면 감사하겠습니다.
안녕하세요. 강의에서 , UserService 와 OrderService 가 서비스로 분리되어 있는 상태에서 UserService 에서 OrderService API 호출해서 데이터를 가져올때, ResponseOrder 클래스를 UserService 프로젝트안에 만드셨던데, 실제 현업에서는 ResponseOrder 를 UserService 와 OrderService 에 중복으로 클래스를 생성하지는 않을 거 같은데요. 서로 다른 프로젝트(UserService 와 OrderService) 에서 공유되는 클래스는 어떻게 관리를 해야하나요.. 프로젝트에 각각 중복해서 클래스를 만들어서 사용하나요?
안녕하세요. 좋은강의 감사합니다. 다름이 아니라 강의에서 설명하실때는 getUserDetailsByEmail 메소드에서 UserEntity 를 UserDto로 맵핑할때 클라이언트가 입력한 password를 Spring Security 가 UserDto의 pwd 파라미터에 암호화하여 넣어준다는 식으로 말씀하신거 같습니다. @Override public UserDto getUserDetailsByEmail(String userName) { UserEntity userEntity = userRepository.findByEmail(userName); if(userEntity == null) throw new UsernameNotFoundException(userName); UserDto userDto = new ModelMapper().map(userEntity,UserDto.class); return userDto; 그게 아니라 단지, ModelMapper 에 STRICT 설정을 해주지 않아서 UserDto의 pwd와 encrytedpwd 값이 모두 UserEntity의 password 값으로 들어간게 아닌가 해서 질문드립니다.
안녕하세요 선생님 강의 정말 잘 듣고 있습니다..! 혹시 더 좋은 방법이 있을까 싶어 질문 드립니다. spring: application: name: api-gateway cloud: gateway: routes: - id: A uri: lb://USER-SERVICE predicates: -Path=/user-service/** 위와 같이 gateway 설정을 하게 되면, user service에도 /user-service/ 라는 path가 같이 합해져 요청 url로 전달되어, Controller의 /user, /health-check, /welcome 같은 매핑을 모두 /user-service/user, /user-service/health-check, /user-service/welcome 으로 변경하라고 말씀 주셨습니다 혹시 이렇게 컨트롤러의 매핑 정보를 변경하지 않고, api gateway 단에서 필터를 이용해 사용자 요청 url을 조작해서 라우팅 할 수 있는 방법이 있을까요..??
users microservice 프로젝트 생성 시, jar와 war의 차이에 대해서 언급해주신 부분에 대해 궁금한 점이 있어 질문 드립니다! 설명 해주시기로, jar로 패키징 시 임베디드 톰캣을 통해 실행이 된다고 하셨는데, IDE에서 프로젝트 실행 시에도 jar는 jre를 통해서 실행되는 것이 아닌가요?.. war로 패키징하는 프로젝트가 웹 어플리케이션 구조로 임베디드 톰캣에 의해 기동된다고 알고 있어서 혼란스러운 부분이 있어서요! 제가 IDE에서 기동할 때와 그냥 서버 위에서 기동할 때를 혼돈하고 있는 걸까요??..