묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
16분 servlet/members 404 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]package hello.servlet.web.servlet; import hello.servlet.domain.member.Member; import hello.servlet.domain.member.MemberRepository; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members") public class MemberListServlet extends HttpServlet{ private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Member> members = memberRepository.findAll(); System.out.println("members : "+members); response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter w = response.getWriter(); w.write("<html>"); w.write("<head>"); w.write(" <meta charset=\"UTF-8\">"); w.write(" <title>Title</title>"); w.write("</head>"); w.write("<body>"); w.write("<a href=\"/index.html\">메인</a>"); w.write("<table>"); w.write(" <thead>"); w.write(" <th>id</th>"); w.write(" <th>username</th>"); w.write(" <th>age</th>"); w.write(" </thead>"); w.write(" <tbody>"); for (Member member : members) { w.write("<tr>"); w.write(" <td>" + member.getId() + "</td>"); w.write(" <td>" + member.getUsername() + "</td>"); w.write(" <td>" + member.getAge() + "</td>"); w.write("</tr>"); } w.write(" </tbody>"); w.write("</table>"); w.write("</body>"); w.write("</html>"); } }servlet 주소의 new-form이나 save는 문제없이 잘 작동하는데, list를 출력하는 페이지에서 404 오류가 발생하여 질문 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Bean Validation 상품 수량 입력 값 넘길 시
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]상품 수량 입력 시 1111111111 Integer 값을 넘기면 숫자를 입력해주세요 메시지 박스가 뜨는데 아마 저의 개인적인 생각은 properties 설정에typeMismatch.java.lang.Integer=숫자를 입력해주세요. 메시지 대로 사용되는 것이고 오버 플로우 문제거나 다른 예외로 lang.Integer 아이디로 쓰인 것이 맞나요? 그리고 이런 예외 사항은 실무에서는 예외로 처리하는지 아니면 서버 단에서 Max 에노테이션 중 어디서 검증하나요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔과 의존관계 자동 주입 제대로 이해한건지 궁금합니다!
[질문 내용]@Configuration 이 붙은 클래스는 스프링 컨테이너에 설정 정보를 의미하는것으로 @Configuration 이게 붙은 클래스도 싱글톤이 보장되어야 하기 때문에 @Bean으로 등록되어 싱글톤을 보장하고 자동주입의 경우에 빈 이름을 @Component 에노테이션이 붙은 클래스를 빈 이름으로, 실제 의존관계 주입이되는 반환 객체를 @AutoWried 에노테이션이 붙은 생성자로 주입되는게 맞을까요?!제 머릿속에 있는 걸 그려봤는데 저런식으로 되는게 맞을까요?!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
MemberApiControllerv1질문있습니다.
package jpabook.jpashop.domains; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; //import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } @RequiredArgsConstructor @RestController public class MemberApiController { private final MemberService memberService; @PostMapping() public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){//jason데이터를 멤버로 쫙 바꿔줌(맵핑해줌_)) Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberResponse{ private Long id; public CreateMemberResponse(Long id) { this.id = id; } } }class Member에 getter,setter가 들어가 있는데 class MemberApiController에 왜 아래처럼 생성자를 생성해주는건가요? public CreateMemberResponse(Long id) { this.id = id; }2. save함수는 아래에도 있는데 굳이 saveMemberV1 할 이유가 있나요? 혹시 api를 만들때는 엔티티매니저가 사용이 안되나요?public class MemberRepository { // @PersistenceContext//스프링이 엔티티 매니저를 만들면서 주입시켜주게 됨. private final EntityManager em; public void save(Member member) { em.persist(member); }3 해당 강의에서 중간중간에 엔티티를 변경 즉 name->username으로 변경 시 api오류가나온다고 하셨는데요. 그런데 아래 코드 v1버전 중 CreateMemberResponse 매개변수에Member member가 주어지는데요. 생성자인 CreateMemberResponse(Long id)가 id만 받아와 지는데, 이 id가 (name이 아닌 id만 받아옴) member의 id기준으로 member의 전체 객체가 받아와져서 그러는건가요?package jpabook.jpashop.api; import jakarta.validation.Valid; import jpabook.jpashop.Service.MemberService; import jpabook.jpashop.domains.Member; import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RestController public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){//jason데이터를 멤버로 쫙 바꿔줌(맵핑해줌_)) Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){ Member member=new Member(); member.setName(request.getName()); Long id=memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberRequest{ private String name;//<-강의 중반주에 adreess넣을지 말지 하는 부분이 있었는데요. 만약 adress를 넣는다면, member.setadress(request.getadress());를 안넣게되면 에러인가요? } @Data static class CreateMemberResponse{ private Long id; public CreateMemberResponse(Long id) { this.id = id; } } }.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 처리하기 - 세션 직접 만들기 질문있습니다.
//에러상황: Non-static method 'expire(javax.servlet.http.HttpServletRequest)' cannot be referenced from a static context SessionManager.expire(request);강의에서도 해당 메소드는 void로 설정이 되어있는데 제코드에서는 static으로 변경하라고 합니다. 왜그런건가요?전체코드는 아래입니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 처리하기 - 세션 직접 만들기 질문있습니다.
public class SessionManagerTest { SessionManager sessionManager=new SessionManager(); @Test void sessionTest(){ //세션을 생성 <-이게 클라이언트단에서 생성이되는건가요? 서버에서 생성하는건가요? MockHttpServletResponse response=new MockHttpServletResponse(); Member member=new Member(); sessionManager.createSession(member,response); //요청에 응답 쿠키 저장 <-서버 저장이고 MockHttpServletRequest request=new MockHttpServletRequest(); request.setCookies(response.getCookies()); //세션조회 <-클라이언트 조회가 맞나요? Object result=sessionManager.getSession(request); Assertions.assertThat(result).isEqualTo(member); }}주석에 질문 달았습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
java -jar -jpashop-0.0.1-SNAPSHOT.jar 관련질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]java -jar 파일을 이용해 스프링을 구동하려고 build로 경로를 바꿨는데 해당 라이브러리가 없으면libs 라이브러리를 따로 만들어야 하는지 아니면 그냥 넘어가도 되는지 궁금합니다.따로 생성시키는 방법이 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2데이터베이스 테이블생성 질문입니다.
h2데이터베이스 생성하고 간단하게 member클래스를 생성해서 h2데이터베이스에서 Member 테이블이 생성되는것을 보려고하는데 코드상으로는 create table로 생성되었다고 뜨는데 db에는 테이블이 생성이안되어있습니다 ㅠㅠ이유가뭘까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 부트 메시지 소스 설정 부분 궁금한 점 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이 의미를 제가 이해한 대로라면application.properties에 제가 아무 것도 추가하지 않으면스프링 부트가 알아서 application.properties에spring.messages.basename=messages 이걸 추가하고, 이렇게 messages만 지정되어도 부가적으로 messages_en.properties, messages_ko.properties 이것들도 인식되는 거로 이해했습니다. 꼭 ko나 en 말고도messages_temp.properties 또는 messages_sdfsdf.properties 이것들도 다 인식된다고 보면 되나요? 아니면 _ 뒤에 와야 하는 건 kr이나 en 등 몇 가지가 따로 지정되어 있는 걸까요? 2) 또 하나 궁금한 점이 있습니다. 스프링 부트를 쓰지 않고@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); messageSource.setDefaultEncoding("utf-8"); return messageSource; }이 코드를 쓴다고 한다면, 이때도 messageSource.setBasenames("messages"); 이렇게 messages만 지정하면 messages_en.properties , messages_ko.properties 다 인식할 수 있나요?
-
미해결
oAuth2.0 로그인 후 쿠키 생성 질문
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // CSRF 설정 http.csrf((csrf) -> csrf.disable()); http.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated() ); http.oauth2Login((oauth2Login) -> oauth2Login .loginPage("/login") .userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint .userService(principalOauth2UserService)) .defaultSuccessUrl("/", true) .permitAll() ); return http.build(); } 현재 위와 같이 우선 oAuth2.0 인증 기반을 구현했습니다.이 상태에서 로그인을 하면웹 브라우저 쿠키에JSESSIONID : 0C3706243FE7B32FF2A3C757013B164C 형식의 값이 삽입됩니다. 이후 test 용으로 작성한 "/user" 경로로 접근을 시도하면 접근이 가능하게 됩니다.만약 쿠키를 지우고 "/user" 로 접근하면 "/" 로 튕기고, 다시 로그인을 해야합니다. 여기서 궁금한 게 저는 별도의 쿠키 생성 로직을 작성하지 않았는데 oAuth 로그인 후JSESSIONID : 0C3706243FE7B32FF2A3C757013B164C이 녀석이 어떻게 생성된 것인지 궁금하며,어떻게 저 녀석으로 인증이 필요한 자원에 접근이 가능한 것인지 원리가 궁금합니다.검색해보니 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키라고 하는데,이게 그냥 인덱스 페이지에 최초 접속할 때도 생기더라구요 ?oAuth 로 로그인하면 값이 바뀌긴 하지만,,, 구글링 해보면 세션 만들고 쿠키 만들고 하던데, 그럴 필요가 없는 거 아닌가요 ?+ 추가질문http.sessionManagement( (sessionManagement) -> sessionManagement .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(1) // 최대 허용 가능 세션 수 .maxSessionsPreventsLogin(false) // 멀티로그인 차단, false : 기존 세션 만료(default) .sessionRegistry(sessionRegistry()) ); 이와 같이 또 세션 정책을 세웠는데, 네이버 웨일로 로그인하고, 크롬으로 로그인 하면 둘 다 로그인 상태가 유지되는데 왜 이러는 걸까요...
-
미해결스프링 핵심 원리 - 기본편
빈 충돌이 일어나는 테스트 오류를 못잡겠습니다ㅠㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]섹션7의 옵션처리 강의를 보며 테스트 코드를 같이 수정하고 있습니다.CoreApplication을 Run 했을 때 발생하는 오류입니다. *************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [C:\Users\hotay\OneDrive\바탕 화면\study\core\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class] 이 부분을 보고 MemoryMemberRepository 와 AppConfig와 AutoAppConfig 코드를 봤는데 뭐가 문제인지 모르겠습니다.package hello.core.member; import org.springframework.stereotype.Component; import java.util.*; @Component //빈등록될때는 앞에가 소문자로, memoryMemberRepository로 등록된다. public class MemoryMemberRepository implements MemberRepository{ private static Map<Long, Member> store = new HashMap<>(); @Override public void save(Member member) { store.put(member.getId(),member); } @Override public Member findById(Long memberId) { return store.get(memberId); } }package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //애플리케이션 전체 동작 방식을 구성(config)하기 위해 // 구현객체를 생성하고 연결하는 책임을 가지는 별도의 설정 클래스 //메서드마다 역할이 드러나게끔 한다. @Configuration //설정정보에 적어주는 어노테이션 public class AppConfig { @Bean //스프링 컨테이너에 등록이 된다. public MemberService memberService(){ return new MemberServiceImpl(memberRepository());//생성자 주입 //MemberServiceImpl이 필요로 하는 MemberRepository 의존성을 외부에서 주입 } @Bean public MemoryMemberRepository memberRepository() {//구현객체를 반환해주는 역할 return new MemoryMemberRepository(); } @Bean public OrderService orderService(){ return new OrderServiceImpl(memberRepository(),discountPolicy());//생성자 주입 } @Bean public DiscountPolicy discountPolicy(){ return new RateDiscountPolicy(); } } package hello.core; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration //설정정보 어노테이션 @ComponentScan( basePackages = "hello.core", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)//AppConfig를 등록하지않도록 필터링 ) //컴포넌트 스캔 일일이 @bean 등록안해도됨 public class AutoAppConfig { //수동으로 빈을 등록하면 자동 빈보다 우선권을 가지게되어 오버라이딩 된다. (충돌오류X) //최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다. // application.properties에 spring.main.allow-bean-definition-overriding=true를 등록하면 오버라이딩 할 수 있다. /* @Bean(name = "memoryMemberRepository") public MemberRepository memberRepository() { return new MemoryMemberRepository(); }*/ } AutoAppConfig에 강사님 말씀 처럼 빈 충돌 테스트 한 부분을 주석처리해줬고 AppConfig를 등록하지 않도록 필터링 했는데도 어디에서 오류를 잡아야할지 모르겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의 질문있습니다.
강의 HandlerExceptionResolver 시작을 듣는데public class ApiExceptionController { }에서 괄호 부분에서 빨간줄이 나오는데 강의코드랑 같은데 왜 나오는건가요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
풀 방식에 질문이 있습니다.
실제 서비스에서 수백 수천의 사용자가 접속을 하였는데 풀에 등록된 커넥션이 100개밖에 없으면 선착순 100명에 들지 못한 나머지 사람들은 계속 대기 하고 반환된 풀을 가져다 사용하는거로 이해했습니다.관리자 입장에서 사용자 대기를 줄이기 위해 풀의 최대 갯수를 최대로 많이 하면 사용자의 대기 없이 즉각적으로 접근이 가능해서 더 좋은 서비스를 제공이 가능한것 같은데 굳이 기본 풀 갯수를 10개로 설정한 이유가 있나요? 그리고 풀의 최대갯수는 몇까지 가능한가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
WAS 내부의 web-server
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이 빨간색이 정확히 WAS 내부의 web-server인거죠?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
WAS 의 web server 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]WAS는 간단히 말씀드리면 Web Server + Web Container(Sevlet Container)로 되어있습니다. 라는 답변을 봐서 궁금한게 생겼습니다. 그냥 정적인 파일만 내려주는 Web Server 는 주로 아파치 를 사용한다고 했는데 WAS = Web Server + Web Container 에서 Web Server 는 뭐로 만들어지나요? 톰캣인가요??
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
실무에서 spring boot 2.6.x 버전을 사용 하고 있는데요.
여기서 강의 나오는 버전 경우 spring security 버전이 6.x 버전입니다. 현재 실무에서 사용하고 있는 spring boot 버전이 2.6.x 인데요. boot 업그레이드 하지 않고 security 버전을 6.x 버전으로 올려도 괜찮을까요?... implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '3.2.5' build.gradle 파일에 이렇게 수정해서 올렸더니 @EnableWebSecurity같은 중요한 객체가 import가 안되는 문제가 생겨서요 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
테스트 실패: Unsatisfied dependency expressed through field 'prototypeBeanProvider'
해당 오류입니다. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'singletonWithPrototypeTest1.ClientBean': Unsatisfied dependency expressed through field 'prototypeBeanProvider': No qualifying bean of type 'javax.inject.Provider<hello.core.scope.SingletonWithPrototypeTest1$PrototypeBean>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 빈 주입이 안되어 오류가 나는 것 같아 @ComponentScan도 달아봤습니다. 빈을 못찾는다고 할까요package hello.core.scope;import jakarta.annotation.PostConstruct;import jakarta.annotation.PreDestroy;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import javax.inject.Provider;import static org.assertj.core.api.Assertions.*;@ComponentScanpublic class SingletonWithPrototypeTest1 {@Test void prototypeFind() {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); prototypeBean1.addCount(); assertThat(prototypeBean1.getCount()).isEqualTo(1); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); prototypeBean2.addCount(); assertThat(prototypeBean2.getCount()).isEqualTo(1); }@Test void singletonClientUserPrototype(){// 스프링 컨텍스트를 생성하고 빈을 가져옴 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(1); // 같은 count가 증가함 }@Scope("singleton")@Component static class ClientBean{// ObjectProvider를 통해 싱글톤 빈과 프로토타입을 함께 사용가능 @Autowired private Provider<PrototypeBean> prototypeBeanProvider; public int logic(){PrototypeBean prototypeBean = prototypeBeanProvider.get(); prototypeBean.addCount(); int count = prototypeBean.getCount(); return count; }}@Scope("prototype")@Component static class PrototypeBean {private int count = 0; public void addCount() {count++; }public int getCount(){return count; }@PostConstruct public void init(){System.out.println("PrototypeBean.init" + this); }@PreDestroy public void destroy(){System.out.println("PrototypeBean.destroy" + this); }}}
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
컨트롤러 메서드명을 명사로 지어도 되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]BasicItemController를 만드실때,상품 목록은 items상품 조회메서드는 item같이 메서드명을 명사로 지었는데,굳이 메서드명을 동사로 안지어도 될까요?어차피 Mapping URL이 중요하고 메서드명은 큰의미없어서관례를 따르지 않은건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외 처리와 오류 페이지 강의 질문있습니다.
서블릿 예외 처리 - 시작 4분 java 17에서는 프로퍼티에 server.error.whitelabel.enabled=false 이부분이 없는데 직접입력해야 false가 되는건가요? 아니면 자동으로 false가 되는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인 처리1 - 쿠키, 세션-회원 가입 질문있어요.
public List<Member> findAll(){에서 new가 나오는 이유가 ArrayList<>의 값을 초기화 해주고 ArrayList배열에 값을 저장해주기 위함인가요?import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Repository;import java.util.*; @Slf4j@Repositorypublic class MemberRepository {private static Map<Long,Member> store=new HashMap<>();private static long sequence=0L;public Member save(Member member){member.setId(++sequence);log.info("save:member={}",member);store.put(member.getId(),member);return member;}public Member findById(Long id){return store.get(id);}public Optional<Member> findByLoginId(String loginId){return findAll().stream().filter(m->m.getLoginId().equals(loginId)).findFirst();}public List<Member> findAll(){return new ArrayList<>(store.values());}} 멤버에 setLoginId 부분에서 에러가 납니다. 테스트 데이터를 보와도 틀린 부분을 못찼겠습니다. 전체코드 첩부합니다. https://drive.google.com/file/d/1uzae3ASJmi4P9EiB-wPMaEnRfgEX_drj/view?usp=drive_link Member member = new Member(); member.setLoginId("test"); member.setPassword("test!"); member.setName("테스터"); memberRepository.save(member);