묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 시큐리티 OAuth2
oauth2 적용시 cors 에러
안녕하세요 디테일한 강의 어렵지만 조금씩 잘 보고 있습니다.좋은 강의 만들어주셔서 감사합니다. 제가 실무에서 oauth2 로 google , naver 로그인 연동에 진행중에 있습니다.spring boot 3.x 버전이고 kotlin 으로 진행중에 있습니다. 현재 cors 에러가 나서 검색하다가https://www.inflearn.com/questions/1064449/authenticationentrypoint-%EB%A5%BC-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95%EB%90%9C-login%EC%9D%B4-%EC%95%84%EB%8B%8C-react-%EC%9B%B9-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A1%9C-%EC%84%A4%EC%A0%95-%EC%8B%9C-cors-%EB%AC%B8%EC%A0%9C%EA%B0%80-%EC%A7%80%EC%86%8D%ED%95%B4%EC%84%9C-%EB%B0%9C%EC%83%9D%ED%95%A9 여기서말씀하신CorsConfigurationSource corsConfigurationSource() 적용해보았고정말 많은 수정을 하였지만 계속 cors 에러가 나고 있는상황입니다.현재 local 에서 작업테스트중이며front : localhost:3000backend : localhost:8080 현재 api 서버입니다. 인증이 필요없는 페이지에서는 axios 로 호출된 데이터가 잘 호출이됩니다.아래는 kotlin 으로만든 securityConfig 입니다.혹시 추가할 사항이 있을까요? 봐주셔서 감사합니다.( 별도의 WonCoinfig 클래스에 corsRegistry 도 추가되어 있습니다. ) package hurryup.hukbizibbackend.config import hurryup.hukbizibbackend.service.CustomOAuth2UserService import hurryup.hukbizibbackend.utils.JWTFilter import hurryup.hukbizibbackend.utils.JWTUtil import hurryup.hukbizibbackend.utils.OAuth2SuccessHandler 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.config.http.SessionCreationPolicy import org.springframework.security.web.SecurityFilterChain import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler import org.springframework.web.cors.CorsConfiguration import org.springframework.web.cors.CorsConfigurationSource import org.springframework.web.cors.UrlBasedCorsConfigurationSource @Configuration @EnableWebSecurity class SecurityConfig( private val customOAuth2UserService: CustomOAuth2UserService, private val oAuth2SuccessHandler: OAuth2SuccessHandler, private val jwtUtil: JWTUtil ) { // // private fun configureCors(corsCustomizer: CorsConfigurer<HttpSecurity>) { // corsCustomizer.configurationSource(corsConfigurationSource()) // } // // @Bean // fun corsConfigurationSource(): CorsConfigurationSource { // println("corsConfigurationSource") // val configuration = CorsConfiguration() // configuration.allowedOrigins = listOf("http://localhost:3000") // //configuration.addAllowedOrigin("*") // configuration.allowedMethods = listOf("GET", "POST", "PUT", "DELETE", "OPTIONS") // //configuration.allowedHeaders = listOf("*") // configuration.allowedHeaders = listOf("Origin", "Content-Type", "Accept", "Authorization", "X-Requested-With", "X-XSRF-TOKEN", "X-Auth-Token", "X-Auth-Token-Expire", "X-Auth-Token-Refresh") // //configuration.exposedHeaders = listOf("Set-Cookie", "Authorization") // configuration.maxAge = 3600L // configuration.allowCredentials = true // // return CorsConfigurationSource { configuration } // } @Bean fun corsConfigurationSource(): CorsConfigurationSource { val config = CorsConfiguration() config.allowCredentials = true config.allowedOrigins = listOf("http://localhost:3000") config.allowedMethods = listOf("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") config.allowedHeaders = listOf("*") config.exposedHeaders = listOf("*") val source: UrlBasedCorsConfigurationSource = UrlBasedCorsConfigurationSource() source.registerCorsConfiguration("/**", config) return source } @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http //.cors { configureCors(it) } .cors { it.configurationSource(corsConfigurationSource()) } http .csrf { it.disable() } http .formLogin { it.disable() } http .httpBasic { it.disable() } http .addFilterAfter(JWTFilter(jwtUtil), UsernamePasswordAuthenticationFilter::class.java) http .oauth2Login { oauth2 -> oauth2.userInfoEndpoint { endpoint -> endpoint.userService(customOAuth2UserService) } .successHandler(oAuth2SuccessHandler) } http .logout { it.deleteCookies("Authorization") // 단순 쿠키삭제 // 이 메소드는 LogoutHandler 인터페이스를 구현한 CookieClearingLogoutHandler 객체를 로그아웃 핸들러로 추가합니다. // CookieClearingLogoutHandler는 생성자에서 받은 쿠키 이름들을 로그아웃 시 삭제합니다. // 이 메소드는 여러 개의 쿠키를 한 번에 삭제할 수 있으며, 추가적인 로그아웃 로직을 구현할 수 있습니다. .addLogoutHandler(CookieClearingLogoutHandler("Authorization")) } http .authorizeHttpRequests { auth -> auth.requestMatchers("/", "/login", "/swagger-ui/**", "/v3/**","/api/v1/users/" + "").permitAll() // root 경로는 모두허용 .anyRequest().authenticated() // 나머지는 인증 필요 } http .sessionManagement { session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } return http.build() } }
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 만료 후 로그인 페이지로 자동 리다이렉트 설정 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요?김영한님께서 만들어주신 로드맵 덕분에 스프링을 잘 이해하고 현업에서 잘 활용하고 있어서 너무 감사드립니다. 현업에서 스프링으로 개발을 하다가 한가지 궁금한게 있어서 문의 드립니다.세션이 만료가 되면 자동으로 로그인 페이지로 리다이렉트 해주는 스프링 내부 셋팅이 어디에 있나요?컨트롤러에서 직접 하고 있지는 않고요, 스프링 내부 어디에선가 해 주고 있는데요... 경험치가 부족해서 찾을 수가 없네요. jdk 1.8을 사용하면서 Spring Framework 4.3.12 를 사용하는것 같네요. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.버젼은 다 맞게 깔렸으며인텔리제이 커뮤니티 버젼으로 설치.2020년 3월 버전으로 설치.오류 해결 부탁드려요!
-
미해결견고한 결제 시스템 구축
테스트 시 오류
안녕하세요 강사님테스트 진행 시에 오류가 발생해서강사님께서 올려주신 샘플 프로젝트에서도 똑같이 테스트 진행해보았으나 동일한 오류가 발생합니다혹시 테이블 제약조건 변경이 필요한건가요..?제가 테이블 생성 시 사용했던 스크립트와 오류메세지 전달드립니다감사합니다 could not execute statement [Cannot add or update a child row: a foreign key constraint fails (`test`.`ledger_entries`, CONSTRAINT ledger_entries_ibfk_1 FOREIGN KEY (`transaction_id`) REFERENCES ledger_transaction (`id`))] [insert into ledger_entries (account_id,amount,transaction_id,type) values (?,?,?,?)]; SQL [insert into ledger_entries (account_id,amount,transaction_id,type) values (?,?,?,?)]; constraint [null]
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
db 컬럼 이름 형식
JPA 관련 질문 드립니다.db 테이블의 컬럼 이름을 만들 때 isSold 라는 컬럼을 케멀케이스 형식으로 만들었습니다.그런데 이러한 함수를 만들어서 사용할려고 하니 계속 에러가 떴습니다.이러한 에러가 나와서 살펴보니 is_sold라는 컬럼을 찾는 것 같은데 저는 IsSold라고 컬럼명을 지어서 오류가 나는 거라고 생각이듭니다.제가 궁금한점은1. jpa가 스네이크케이스 형식으로 컬럼명을 자동으로 찾는 것 같아 오류가 나오는 걸로 생각이 드는데 이게 맞을까요?2. 그럼 db의 컬럼 명을 처음 만들 때 컬럼명이 길 경우 스네이크케이스 형식으로 만들어야 할까요? 보편적으로 어떻게 하는지 궁금합니다.
-
미해결견고한 결제 시스템 구축
JpaLedgerTransactionMapper.class
강사님 샘플 프로젝트에서 발견한 오타 제보드립니다!!referenceType = ledgerTransaction.referenceType,referenceType = ledgerTransaction.referenceType.name,
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
깃허브 주소
선생님 강의에서 코드 대신 필기하며 듣고싶어 그런데 강의 코드가 있는 깃허브 주소는 없을까요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
o.s.b.d LoggingFailureAnalysisReporter 오류
2024-05-16T23:53:30.318+09:00 ERROR 11428 --- [library-app] [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : ***************************APPLICATION FAILED TO START***************************Description:Parameter 0 of constructor in com.group.libraryapp.service.book.BookService required a bean of type 'com.group.libraryapp.domain.book.BookRepository' that could not be found.Action:Consider defining a bean of type 'com.group.libraryapp.domain.book.BookRepository' in your configuration.Process finished with exit code 0이런 오류가 뜨는데 bean 설정도 강의 내용그대로 한거 같은데 계속 코드를 수정하려고 해도 Error 가 떠서 해결방법을 모르겠습니다package com.group.libraryapp.service.book; import com.group.libraryapp.domain.book.Book; import com.group.libraryapp.domain.book.BookRepository; import com.group.libraryapp.domain.user.User; import com.group.libraryapp.domain.user.UserRepository; import com.group.libraryapp.domain.user.loanhistory.UserLoanHistory; import com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository; import com.group.libraryapp.dto.Book.request.BookCreateRequest; import com.group.libraryapp.dto.Book.request.BookLoanRequest; import com.group.libraryapp.dto.Book.request.BookReturnRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class BookService { private final BookRepository bookRepository; private final UserLoanHistoryRepository userLoanHistoryRepository; private final UserRepository userRepository; public BookService( BookRepository bookRepository, UserLoanHistoryRepository userLoanHistoryRepository, UserRepository userRepository) { this.bookRepository = bookRepository; this.userLoanHistoryRepository = userLoanHistoryRepository; this.userRepository = userRepository; } @Transactional public void saveBook(BookCreateRequest request){ bookRepository.save(new Book(request.getName())); } @Transactional public void loanBook(BookLoanRequest request){ Book book = bookRepository.findByName(request.getBookName()) .orElseThrow(IllegalArgumentException::new); if(userLoanHistoryRepository.existsByBookNameAndIsReturn (book.getName(),false)){ throw new IllegalArgumentException("이미 대출되어 있는 책 입니다"); } User user = userRepository.findByName(request.getUsername()) .orElseThrow(IllegalArgumentException::new); userLoanHistoryRepository.save(new UserLoanHistory(user, book.getName())); } @Transactional public void returnBook(BookReturnRequest request){ User user= userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); UserLoanHistory history = userLoanHistoryRepository.findByUserIdAndBookName(user.getId(), request.getBookName()) .orElseThrow(IllegalArgumentException::new); history.doReturn(); } } package com.group.libraryapp.domain.book; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface BookRepository extends JpaRepository<Book,Long> { Optional<Book> findByName(String bookName); }
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
DB강의 듣다 강이ppt의 외래키 부분을 보고 궁금증이 생겨 질문 남깁니다.
웹 개발을 할 때 DDL을 통해 생성되는 테이블들은 모두 서비스에서 사용되는 객체들을 보고 만드는것 같은데 (예를 들면 Member 클래스, Item클레스들을 생각했습니다)만약 어떤 회원 A가 아이템A를 등록하였으면 데이터 베이스의 회원과 아이템 사이에는 등록이라는 관계가 생성이 되고 회원 1명은 아이템을 여러개 등록이 가능하다면 Member 테이블의 PK를 Item 테이블의 FK로 등록되며 Item 테이블의 속성들은 (id, item_name, price, quantity, member_id)로 설정이 될것 같은데 이런 경우 Item 클레스의 멤버변수로Member member_id; 를 생성해주어야 할것 같은데 이런 외래키 값은 도메인을 설계할때 어떻게 처리해야 하나요?그리고 api로 통신할 때 클라이언트 에게 데이터를 넘겨줄 때 스프링 입문 강의에서 hello 객체자체를 return 하면 스프링의 잭슨라이브러리가 json포멧으로 변환해서 넘겨준다고 해주셨는데 여러개의 테이블이 조인된 결과를 json으로 반환 해주려면(예를 들어서 멤버 A가 등록한 아이템의 이름과 가격, 멤버의 이름을 요청한다면 반환되는 튜플이 item_name, price, member_name) 이것들은 하나의 객체가 아닌 Member클래스와 Item클래스의 일부 변수들을 사용한 새로운 값들인데 이럴때는 어떤 방법으로 return해주어야 하나요? 클라이언트측과 조율을 하여 검색되는 조건을 설정하여 조인검색의 제약을 설정하나요? 제약을 설정한다면 반환할 때 (item_name, price, member_name)이 3개의 속성들을 멤버변수로 사용하는 새로운 클래스를 생성하여 반환해 주어야 하나요?
-
해결됨스프링 핵심 원리 - 기본편
assertThat() 인자값 질문있습니다.
assertThat() 메서드에 대해서 찾아 봤는데, 매개변수 이름이 actual(실제값) 이더라구요. 그리고 isEqualTo() 메서드의 매개변수 이름은 expected(기대값)이구요.그러면 assertThat() 메서드를 호출할 때 인자값으로 테스트하고자 하는 값을, 그리고 isEqualTo() 메서드는 테스트의 결과로 기대되는 값을 넘기는게 맞지 않나요?여기 아래 코드에서 memberService.findMember(1L)로 찾아온 회원(findMember)이앞서 직접 만들어서 join으로 넘긴 member와 같아야 하는 거니까Assertions.assertThat(findMember).isEqualTo(member)가 맞는거 아닌가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
localhost:8080 에러에 관하여..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 현재 프로젝트 생성 강의에 나오는대로 따라하였는데 톰캣이 뜨지 않는데 뭐가 문제인지 잘 모르겠습니다..
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HttpServletRequest request, HttpServletResponse response 사용이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Controller public class SpringMemberSavaControllerV1 { private MemberRepository memberRepository = MemberRepository.getInstance(); @RequestMapping("/springmvc/v1/members/save") public ModelAndView process(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); Member member = new Member(username, age); memberRepository.save(member); ModelAndView mv = new ModelAndView("save-result"); mv.addObject("member", member); return mv; } }이 코드에서 컨트롤러가 저 HttpServletRequest request, HttpServletResponse response 이 파라메타를 받는다는건 DispatcherServlet > 어댑터 > 컨트롤러까지 실행될때 계속 매개변수로 HttpServletRequest request, HttpServletResponse response 이걸 넘겨준건가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
초반 진행 시 오류
Execution failed for task ':JpashopApplication.main()'.> Process 'command 'C:\Program Files\Java\jdk-17\bin\java.exe'' finished with non-zero exit value 1 이런 오류가 계속 나고 있습니다. 최대한 똑같이 따라하고 있다 생각했는데 어디가 잘못된 걸 까요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔시 빈이름 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]컴포넌트 스캔시 빈 이름이 자동으로 구현된 클래스의 이름으로 설정되게 되는데요. 이 경우 DIP 위반과는 상관없는 건가요?? 예를 들어 memoryMemberRepository 처럼요.물론 타입으로 조회 시에는 MemberRepositoy.class로 조회가능하지만, 이름으로 조회시에는 클래스명(앞에 소문자)로 조회해야 되서요. 공부중 궁금해져서 질문 드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스크린 샷 문의
안녕하세요 인프런에서 업데이트를 한 것인지 어제까지만 해도 잘 되던 스크린샷 기능이 오늘부터 갑자기 안되네요..ㅜㅜ예전에는 이런 식으로 강의 노트에 스크린샷 기능을 통해서 전체화면 말고 필요한 부분만 캡쳐하고 정리했었는데..혹시 인프런 자체의 일시적인 문제일까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 시큐리티와 필터 그리고 인터셉터 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 항상 강의 잘 보고 있습니다.서블릿 필터는 서블릿이 제공하는 기술이고,스프링 인터셉터는 스프링 MVC가 제공되는 기술이라고 설명하셨습니다.또한, 인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공하고, 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 더 편리하다고 말씀하셨습니다. 그리고 스프링 시큐리티는 필터들의 집합이라고 이해하고 있습니다. 그러면 실무에서는 스프링 시큐리티로 필터를 사용하고,인터셉터를 스프링 MVC에서 사용하는 등 함께 사용하나요?? 즉, "스프링의 시큐리티의 Filter는 Servlet Container에서 동작하여 모든 요청에 대해 실행되므로 보다 저수준의 작업을 처리하기에 적합" 하고,"스프링 MVC의 Interceptor는 주로 프레임워크나 비즈니스 로직에 특화된 작업을 처리할 때 사용되며, 스프링과 같은 프레임워크에서 제공하는 레벨에서 사용함"이라고 이해하면 되는건가요?? 강의를 보다 보면 인터셉터가 필터보다 더 유용하다고 느껴졌는데 실무에서는 어떻게 사용하는지 궁금합니다 ! 감사합니다
-
미해결Practical Testing: 실용적인 테스트 가이드
a 서비스에서 b 서비스를 의존하는 코드에 대한 테스트는 어떻게 해야 되나요??
안녕하세요 강사님, 궁금한게있습니다.인스타그램, 페이스북을 사용할 때 제가 쓴 게시글에 다른 사람이 댓글을 달면 알림이 생성되는데, 제가 작성한 로직에서는 CommentService에서 댓글을 작성하고 alarmService를 호출하여 알림까지 생성하는 로직입니다.이렇게 로직을 짰을 때 제가 생각한 문제점에 대한 해답을 찾고 싶습니다.1. CommentService에서 다른 Service를 의존하게 되는 것2. 댓글 작성이라는 테스트를 짤 때 댓글 작성에 초첨을 맞출 수 없고 알림까지 테스트를 작성해야 되기 떄문에 핵심 기능 외에 다른 부가적인 기능 때문에 테스트의 집중도가 떨어집니다.3. 한 트랙잭션에 묶여서 알림을 생성하는데 문제가 발생하면 댓글도 생성되지 않습니다.이러한 경우 어떤 학습을 통해 개선할 수 있는지 가르쳐주실 수 있나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
EntityManager 주입 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]JpaConfig 안에 있는 EntityManager는 어떻게 주입이 되는 건가요? 제가 대략적으로 생각한 바는 ItemServiceApplication 이 @SpringBootApplication 어노테이션이 붙어있어서 스프링 부트로 작동하게 되고, @Import(JpaConfig.class) 애노테이션을 붙여줌으로써 스프링부트와 JpaConfig가 연동되게 되어서 스프링부트가 JpaConfig에서 쓰이는 EntityManager를 자동으로 주입해주는 것입니다. 제가 생각한 내용이 맞는지 궁금하고요 선생님들의 정확한 설명을 듣고 싶습니다. 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
SpringDataJpaConfig 파일 없이 실행 방법 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]SpringDataJpaConfig 파일 없이 @ComponentScan을 사용해서 프로그램을 실행 해보고 싶습니다. 그래서@SprinBootApplication(scanBasePackages="hello.itemservice") 로 스캔 범위 변경 @Import(SpringDataJpaConfig.class) 주석 처리 @Component이 붙은 파일은 자동 빈 등록이 된다고 알고 있습니다. 추가로 처리 해야 할 부분이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
싱글톤 @Configuration
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]class StatefulServiceTest { @Test void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); // Thread A : A 사용자 10000원 주문 // statefulService1.order("userA", 10000); int userAPrice = statefulService1.order("userA", 10000); // Thread B : B 사용자 10000원 주문 // statefulService2 .order("userB", 20000); int userBPrice = statefulService2.order("userB", 20000); // Thread A : A 사용자 주문 금액 조회 // int price = statefulService1.getPrice(); // System.out.println("price = " + price); System.out.println("userAPrice = " + userAPrice); System.out.println("userBPrice = " + userBPrice); } static class TestConfig { @Bean public StatefulService statefulService() { return new StatefulService(); } } }이 코드에서 TestConfig는 @Configuration 어노테이션을 붙이지 않았는데 어떻게 싱글톤이 보장된건가요?