안녕하세요, 강사님. 저는 백엔드 1년 차 주니어 개발자입니다. 강사님 덕분에 TDD 학습을 차근차근 진행하고 있는데, 한 가지 궁금증이 생겨 질문드립니다. 현재 강의에서는 매번 API 기능을 구현할 때마다 @SpringBootTest 를 사용하여 테스트하고 계신데요. 만약 프로젝트 규모가 엄청 커져서 컨텍스트 로딩 시간이 5초 이상이 소요되는 경우, 테스트 결과를 기다리느라 “ 개발 흐름이 끊기는 ” 문제가 발생할 것 같은데요. 현업에서는 이 부분을 어떻게 관리하시는지 궁금합니다. 매번 @SpringBootTest 를 그대로 사용하며 시간을 감수하시는지 특정 테스트만 빠르게 실행하는 슬라이스 테스트( @WebMvcTest 등)를 병행하시는지 그 외 다른 최적화 기법이 있는지 조언 부탁드립니다. 😊
Docker를 설치한다. = 설치 방법은 구글링에 "Windows Docker 설치"만 검색해도 많은 자료가 있습니다. vim 설치 = 기본적으로 windows는 리눅스 환경이 아니기 때문에 CMD 또는 Powershell에서 강의처럼 vim을 사용하지 못합니다. 아래 링크를 통해서 설치만 해주고 프롬프트에 vim 입력하시면 사용 가능합니다. https://velog.io/@deadkim/windows-vim-windows%EC%97%90%EC%84%9C%EC%9D%98-vim-%EC%82%AC%EC%9A%A9
현재 페이지네이션 기반 조회 시 조회 과정이 궁금해서 질문드립니다. secondary index에서 offset 위치까지 순차탐색 -> secondary index -> 클러스터링 인덱스에서 primary key 조회 -> 실제 데이터 조회 일단 위 과정이 맞는지 궁금합니다. 2 . 위 과정이 맞다면 이 과정에서 db에서 데이터 조회를 limit만큼 반복하는 것인지, 아니면 실제 db에서 데이터 조회는 한 번에 이루어지는 것인지 궁금합니다. 페이지 조회 말고 그냥 범위 조회일 시에는 한 번에 조회되서 값이 많아도 시간 차이가 많이 안나는지 궁금합니다. offset 없이 조회해보니 바로 조회되는 거 같긴합니다.
킬구형 일부러 그런건진 모르겠는데, 우선은 Batch Listener 섹션에서 실행명령에 전부 --job.name=~~ 형식으로 되어있어. 잡이름을 인식 못해서 Job Bean이 여러개 명시되어있으면 실행할때 오류나는 것 같아. --spring.batch.job.name= 처럼 안하면 안될 것 같은데, 이건 의도적으로 줄인걸까?
의지 할 곳이 선생님 밖에 없어서 이렇게 질문 드립니다 ㅠ,ㅠ 우리 회사에서 Elastic Search 를 이용해서 검색 기능을 서비스 출시 하고자 합니다. 참고로 데이터는 20~30만건 정도 됩니다. Elastic Cloud 에서 비용에서 각각 기능에 따라 등급이 있더군요. Standard Gold Platinum Enterprise 차이 간단하게 이렇게 검색해서 한번 확인 해보니깐 잘 나와 있긴 합니다만... 아무래도 선생님이 제공해주신 강의 보고 처음 접해보고 이것을 상용에서 적용 하고자 하니 비용적 부분에서 고민을 안 할 수가 없습니다. Enterprise 으로 갈수록 비용이 2배로 가긴 하지만 기능을 더 제공해주는 것 같습니다. 하지만 저희는 20~30만개 정도 데이터를 활용 및 서치 기능을 구현하는 것이고 기능도 선생님께서 알려주신 기능 안에서 해결이 가능 할 것 같습니다. 정리하자면 20~30만개 정도 데이터를 이용해 검색 기능 제공 해야함 (앞으로 데이터 추가는 예상 됩니다.) 기능은 선생님이 알려주신 기능에서 충분히 가능 할 것 같습니다. 가능한 모니터링 기능이 있었으면 좋겠습니다. 그럼 standard 도 괜찮은 선택인지 알고 싶네요. 아무래도 회사가 큰 규모가 아니다 보니 비용적 부분에서 생각 안 할 수가 없습니다. (모니터링 기능도 있었으면 좋겠네요.) 다시 한번 영상 강의 만들어 주셔서 감사드리고 앞으로 더 좋은 강의 기대하도록 하겠습니다. 응원합니다. 감사합니다 :)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. store를 List로 만들지 않고, Map으로 만든 이유가 궁금합니다. 더 효율적인 뭔가가 있는지요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] ***문제해결**** JDBCRepository 구현시 이걸 안 붙혀넣고 이렇게 써서 생긴 오류인 것 같습니다.. 다른 질문글에서 보고 알았습니다 하하.. *************** @Transactional 어노테이션을 썻지만, h2 DB에서 롤백이 되지 않습니다. 롤백이 되지 않은 이유가 스프링 버전과 h2 버전이 바뀌어서 그런건가요? 테이블을 초기화하고 스프링통합memberServiceTest 를 진행하니 회원가입한 정보가 테스트가 끝난 후 DB에 고스란히 남아있었습니다. #스프링 환경 Java-> 17 spring->3.4.3 h2 : 2.3.232 -> 서버모드 접근함(jdbc:h2:tcp://localhost/~/test) #알아본것 h2에 서버모드로 접근하면, spring->네트워크->h2 이렇게 접근이 되어서 외부에 있는 DB는 롤백을 안한다고 들었습니다. 다른 곳에서도 접근해서 고칠 수 있기 때문에,, 그래서 대신 메모리모드를 사용하라고 답변을 들었습니다.
안녕하세요 "인가 설정 실시간 반영하기" 코드에서 동시 세션 제어 기능을 추가할려고 합니다. http.sessionManagement(session -> session .maximumSessions(1) .maxSessionsPreventsLogin(true) ) 위 코드를 추가한 후 REST 방식으로 로그인후 로그아웃을 하면 SessionRegistry의 principals 객체에 있는 정보가 삭제되지 않아 다시 로그인을 시도하면 인증오류가 발생합니다. 로그아웃을 할 경우 SessionRegistry.removeSessionInformation(sessionId)가 호출되어 principals 정보가 삭제되어야 할 것 같은데 제가 잘못 이해하고 있는 지 궁금합니다.
한다 제보를 KILL-9, 바란다 응답 [제보 정보 수집중... 🤖 ] [KILL-9@user]$ cd 커리큘럼/섹션4/3장/작전1 해킹 주문 데이터베이스 정찰 작전에서 프락치를 발견했다 JdbcPagingItemReader 가 whereClause에 거짓 증거를 제출해서 혼란을 야기했다 status = 'READY_FOR_SHIPMENT' 이고 not null 이어햐 하지 않을까 생각한다 CANCELLED 가 아닌 것 같다 다시 보니 작전에 혼동이 있는 것 같다 확인요망 🔥 유해 게시물 처형 작전 시스템에도 버그가 발견됐다 전체코드에서 JpaCursorItemReader 에 queryString 조건이 잘못된 것 같다 이후의 예시 코드들은 잘돼있지만 전체코드 복사하는 녀석들이 많기 때문에 처리부탁한다 [추가 처형 요청... 💀 ] [KILL-9@user]$ cd 커리큘럼/섹션3/2장/작전1 글 쓰는 김에 한 녀석도 추가 제보하겠다 FlatFileItemReader 고정길이 예제도 처형 부탁한다 소제목인 .columns() 예제 이미지가 정확하다 하지만 예시코드라고 적혀있는 Range는 틀렸다 이것은 KILL-9 후보생의 혼란만 가중시킬뿐이다
현재 댓글 무한 depth까지 수강했는데 snowFlake를 통해 Id값을 넣고 있는데 해당 부분을 service단에서 entity.create를 통해 구현하는 점에 대해 궁금증이 생겼습니다. 이런 방식으로 계속 진행이 되면 보일러 플레이트방식이 되는것 같은 느낌이 들어서 차라리 커스텀 IdentifierGenerator를 통해 Entity안에서 값을 넣어주면 어떨까하고 생각을 해보게 되었습니다. 이렇게 진행하면 기존 service를 통해 진행하는 것보다 비효율적일까요?? 두개의 차이점이 궁금합니다
예제를 따라하고 있는데요 public ChatClient chatClient(ChatClient.Builder chatBuilder){ return chatBuilder .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()).build(); } 이부분이 에러가 나서 MessageChatMemoryAdvisor를 생성을 못하는데요.. 어떻게 해야 할까요? spring ai버전이 1.0.0버전인데 버전에 따라 코드가 바뀌는것 같은데요..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 선생님 강의를 통해 배움을 얻고 프로젝트를 하며 성장 하고 있습니다. 프로젝트를 하던중 영속성 전이와 관련하여 궁금한점이 생겨 질문 드립니다. ( 영한님 JPA 강의에 질문 하는것이 맞으나 JPA는 책을 사서 여기에 질문 드립니다 ㅠㅠ ) 회원과 주소는 양방향 관계를 두고 있습니다. 회원과 주소를 연관관계 매핑하여 회원을 저장하면 영속성 전이를 통해 주소가 같이 저장 됩니다. 그런데 문제는 둘다 영속 상태일때 주소를 제거 하면 delete 쿼리가 나가지 않았습니다. 이런 저런 실험을 해본 결과 영속성 전이 때문에 삭제 되지 않은것으로 보았습니다. 영속 대상인 주소를 삭제 하려고 했으나 회원의 연관관계인 Address는 그대로 있기 때문에 영속성 전이로 인해 삭제가 되지 않았다로 판단 하였습니다. 영속성 컨텍스트에 주소만 있을 경우 주석 으로된 부분을 실행하면 영속성 전이를 수행할 회원이 없기 때문에 delete 쿼리가 나가게 됩니다. 제가 생각한게 맞는지 궁금하여 질문 드립니다. 밑의 예시의 경우 회원이 영속 상태인 경우 영속성 전이 때문에 연관관계를 끊지 않으면 영속 대상인 주소가 delete가 안되는게 맞을까요? @DisplayName("회원과 연관된 주소를 제거할때 자식인 주소를 제거 하면 delete 쿼리가 발생하지 않는다.") @Test void deleteAddress() { //given User user = new User("회원"); Address address = new Address("주소"); address.connectUser(user); //when em.persist(user); em.flush(); boolean isAddressManaged = em.contains(address); System.out.println("Address is managed? " + isAddressManaged); addressRepository.deleteById(address.getId()); em.flush(); em.clear(); //then //Address findAddress = addressRepository.findById(address.getId()).orElseThrow() //addressRepository.deleteById(findAddress.getId()); //em.flush(); } [ 회원 ] @Getter @Setter @Table(name = "users") @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(mappedBy = "user", cascade = CascadeType.PERSIST) private Address address; protected User() {} private String name; public void connectAddress(Address address){ this.address = address; } } @Getter @Entity public class Address { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; private String addressName; protected Address() {} public Address(String addressName) { this.addressName = addressName; } public void connectUser(User user){ this.user = user; user.connectAddress(this); } }
로그인시도 -> Securty -> FILTER 사용자가 DB에있으면 OK -> JWT발급 이 흐름이 맞는지요..? 그리고 OAUTH2는 로그인시도 -> 카카오 코드받아서 인증을 받고 -> 토큰으로 사용자 정보를 가져와서 로그인 -> 로그인 후 jwt발급 근데 궁금한게 oauth2도 회원가입이 왜 필요한걸까요? 시큐리티때문이라고한다면 토큰으로 사용자정보를 가져오는걸로 db에서찾은거처럼 판단을 못하는지요 제가 헷갈리는게 jwt든 oauth2든db하고 관련이 어떻게잇는건지가 헷갈립니다 jwt도 db에서 사용자정보를 가져와서 담을수도있지않나요? oauth2가 db에 사용자정보가 왜필요한지도 헷갈립니다 만약 사용자정보가 저장이 최초에 된다면 그다음부터는 그냥 oauth2로그인으로 안타는건지 그냥 security의 로그인을 타는건지 궁금합니다. 그리고 현재 강의에서는 시큐리티를 안쓰고 openfeign를 쓰셔서 코드를 받고 그 코드로 요청을 보내서 토큰을 받고 그 토큰으로 사용자정보를 받는걸로 이해를 했습니다. 시큐리티에서는 해당과정이 없는걸로 알고있는데 맞는지요