묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
스프링부트 html 질문
강의 html에서는 CRUD 버튼을 js로 제어 하신 것 같은데html에서 <form action="/postuser" method="POST">이런 식으로 작성하고 어노테이션마다 /user부분을 다르게 해줘도 가능한가요?
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
테스트 코드 내의 지역변수를 final로 선언하는 이유가 궁금합니다.
테스트 코드 내에서 인텔리제이 자동 필드선언 기능 사용시 저는 따로 상수키워드가 붙지 않는데. 선생님께서는 final이 자동으로 붙는 것 자체도 신기하지만 그 이유가 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
Jpa(Hibernate)가 올라오는 과정을 공부해 보고 싶습니다.
안녕하세요 Spring Data jpa 이용해서 프로젝트를 하던중 웹 검색을 하다가 아래와 같이 사용할 수 있다는 것을 알게 되었습니다.public interface ItemRepository<T extends Item> extends JpaRepository<T, Long> {} public interface BookRepository extends JpaRepository<Book, Long> {} public interface AlbumRepository extends JpaRepository<Album, Long> {} public interface MovieRepository extends JpaRepository<Movie, Long> {}Item을 상속받은 객체를 repository ItemRepository 에 넣으면 잘 들어갑니다.더 신기한 것은 Item객체를 상속 받은 Book객체를 BookRepository에서 찾을 수 있습니다. 아마 내부적으로 Jpa(hibernate)에서 엔티티에 있는 어노테이션을 뒤져서 조인 전략을 사용한 것이라는 사실을 애플리케이션 시작 전에 알고 있을텐데, 정확히 어떤 방식으로 이것을 귀신같이 알고 있는 건지 잘 이해가 되지 않습니다.(item객체인지만 알 수 있을텐데, 어떻게 BookRepsoitory에도 나머지 데이터를 넣어주는지 너무 궁금합니다.)DataJpa나 하이버네이트 관련 메뉴얼도 많이 찾아 보았는데, 내부적으로 작동하는 것에 대해서는 크게 설명하지 않고 사용법만 있어서 해당 부분 키워드나 방법이라도 알 수 있지 않을까 싶어서 질문 드립니다. 그리고 위의 예제는 아래 블로그에서 찾을 수 있었는데, 강의에 있던 내용이라고 댓글에 적혀 있었는데요제가 빼먹은 건가 싶어서 열심히 책과 모든 강의를 찾아보았지만.. 저는 찾을 수 없었는데요, 혹시라도 강의에서 언급 하시고 넘어가셨다면 해당 부분이라도 알고 싶습니다.블로그 링크는 아래와 같습니다.https://jyami.tistory.com/23 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
EntityManager관련 질문
@Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; 안녕하세요 EntityManager을 위처럼 주입받을 때 주입시점이 MemberRepository에 @Repository가 있으므로 MemberRepository가 스프링 빈에 등록되고 의존관계 주입을 할 때인가요? 그렇기 때문에 더더욱 @Repository가 필요한가요?
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
io.jsonwebtoken.security.WeakKeyException 해결방법
현재 강의 기준으로 실행 할 경우 WeakKeyException 예외가 발생합니다. secret Key 길이를 늘려주세요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
배포 환경에서 db 분리 질문
안녕하세요 영한님! 항상 강의 정말 잘 듣고 있습니다!gradle build를 진행할 때 테스트 코드를 수행하는 걸로 알고 있습니다.테스트 코드는 운영 db가 아닌 테스트용 db를 통해 수행하도록 하는게 맞을까요? 생각하고 있는 방법은1. test/resources에 application.yml을 추가해서 테스트 코드는 인메모리 db (h2)를 통해 수행 2. ec2 안에 테스트용 mysql 컨테이너를 띄워두고 mysql을 통해 테스트 코드 수행이렇게 2가지 방식을 생각중인데 맞는 방법일까요??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
왜 @Configuration의 WebSecurity 클래스에서 생성자 주입을 하지 않나요?
@Configuration@EnableWebSecuritypublic class WebSecurity { extends WebSecurityConfigurerAdapter { private UserService userService; private BCryptPasswordEncoder bCryptPasswordEncoder; private Environment env; public WebSecurity(Environment env, UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder) { this.env = env; this.userService = userService; this.bCryptPasswordEncoder = bCryptPasswordEncoder; }강의에서 보면 @Configuration으로 WebSecurity클래스가 설정되어있기에 userService, bCryptPasswordEncoder, environment 인스턴스가 준비되어 있다고합니다. 따라서 위의 코드와 같이 생성자주입을 하지않는데, 왜 @Configuration으로 설정되어 있으면 @Autowired로 주입을 받지 않아도 되는 걸까요?
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
JPA를 이용한 개별 사용자 상세 조회 5분 21초
섹션 5. Java Persistence API 사용 JPA를 이용한 개별 사용자 상세 조회 5분 21초 캡처 화면입니다.응답 값으로 id는 없고 name, joinDate, link정보만 나오는 이유가 궁금합니다.
-
해결됨스프링 부트 - 핵심 원리와 활용
@Profile을 이용해 환경에 맞는 bean을 등록하는 과정에 대해 궁금한 것이 있습니다.
안녕하세요. 항상 좋은 강의 올려주셔 감사합니다. 강의를 보며 @Profile으로 빈을 환경(로컬, 개발, 운영)에 따라 달리 등록하는 과정에 대해 궁금한 점이 생겨 질문 올립니다. 영한님은(약 1분36초 쯤) "로컬에서는 로직을 테스트하기 위해 빈을 등록한다." 라는 뉘앙스로 빈을 환경에 따라 달리 등록한다 말씀하셨는데 저는 "테스트 환경을 위해 빈을 등록한다"는 느낌을 받았습니다. 저는 과거 클린코드에 대해 공부하며 테스트를 위한 코드와 실제 비즈니스 로직이 담긴 코드는 서로 분리하는 것이 좋다고 배웠습니다. 이러한 관점에서 보았을때 LocalPayClient와 payConfig에서 localPayClient() 메서드는 @Slf4j @Configuration public class PayConfig { @Bean @Profile("default") public LocalPayClient localPayClient(){ log.info("LocalPayClient 빈 등록"); return new LocalPayClient(); } @Bean @Profile("prod") public ProdPayClient prodPayClient(){ log.info("ProdPayClient 빈 등록"); return new ProdPayClient(); } } 테스트를 위한 코드라 생각이 들며 결과적으로 pay디렉토리 내부에 테스트를 위한 객체와 실제 비즈니스를 위한 객체가 섞여 어색하다는 느낌을 받았습니다. 혹시 이에 대해서 어떻게 생각하시는지 궁금합니다! 안정적인 테스트를 위해 어쩔수 없이 희생해야 하는 부분일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 run이 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 그대로 따라했고 17버전으로 맞췄는데 강의에서 선생님처럼 화살표 (run) 버튼도 뜨질 않고The file in the editor in not runnable 이라고 나옵니다 구글링해서 configuration을 추가해보았으나 잘 안되는 것 같습니다도와주세요 ㅠㅠ
-
미해결토비의 스프링 부트 - 이해와 원리
dependency-management 버전 질문
안녕하세요. 현재 스프링 부트 2.7 버전을 사용하고 dependency-management 버전을 최신 버전으로 1.1.4를 사용해도 스프링 부트 버전에 맞는 라이브러리 버전을 가져오고 문제없이 동작하는 걸 확인했는데요.또한 부트 2.7 버전 출시 전에 나온 1.0.5를 적용해봐도 라이브러리 버전은 동일하고 동작엔 문제가 없었습니다.io.spring.dependency-management 버전은 크게 중요하지 않는걸까요??
-
미해결스프링 부트 - 핵심 원리와 활용
properties파일 혹은 yaml파일을 통해 설정 데이터를 관리하는 방법에 대해 질문이 있습니다.
안녕하세요 강의 잘 보고 있습니다. 강의에서 언급해주신 내부 파일을 통한 설정 데이터 관리에 대해 궁금한 점이 있어 질문 드립니다. 강의에 있는 내용대로 소스코드와 설정데이터를 같이 관리한다고 하였을때 깃헙을 통해 버전관리를 하게 되면(public 레포지토리라 가정) 외부에 설정 정보가 노출되는 보안상 문제가 발생하게 되지 않을까요? 해당 이슈를 막기 위한 방법으로는 깃 이그노어에 설정파일을 추가하고 pull할 때 마다 설정파일을 공유를 하는 방법이 있을것 같습니다. 그러나 이는 설정 파일에 대한 버전을 관리하지 못하는 문제점이 발생하기에 바람직한 방법은 아니라 생각합니다. 이러한 상황에 대해서 버전관리 레포를 private으로 하는것 이외의 해결책은 존재하는지 궁금합니다.
-
미해결백엔드 개발자 성능 개선 초석 다지기
java17환경에서 scouter 실행법 문의
java17에서 scouter를 구동할수있는 방법이 있을까요?server는 강제적으로 java11로 실행시켰지만인텔리제이 안에서 VM옵션을 넣어 에이전트와 함께 실행시키면 java.lang.IllegalArgumentException: Unsupported class file major version 61에러가나네요 ㅜㅜ서로 호환이 안맞나봅니다.. scouter는 무조건 java11환경에서만 구동해야하나요?
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
EntityModel과 ResponseEntity의 차이
*UserController@GetMapping("/users/{id}") public EntityModel<User> retrieveUser(@Parameter(description = "사용자 ID", required = true, example = "1") @PathVariable int id) { User user = service.findOne(id); if (user == null) { throw new UserNotFoundException("id-" + id); } EntityModel entityModel = EntityModel.of(user); WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers()); entityModel.add(linkTo.withRel("all-users")); // http://127.0.0.1:8080/users try { return entityModel; } catch (Exception ex) { throw new RuntimeException(); } } @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user) { User savedUser = service.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.created(location).build(); } 두 클래스가 비슷하게 느껴져서 질문드립니다.EntityModel 클래스는 Spring HATEOAS에서 지원하는 클래스로 위의 코드로 특정 사용자 정보를 조회하면서 동시에 관련 리소스로 쉽게 이동할수 있는 링크를 제공을 도와주는 클래스고ResponseEntity클래스는 Spring MVC에서 지원하는 클래스로 HTTP 응답을 제어할 수 있도록 도와주며, 상태 코드, 헤더, 바디 등을 포함할수 있게 도와주는 클래스다. 라고 이해하면될까요 ?? 그렇기 때문에 Get에서는 해당 자원에 대한 추가적인 리소스를 제공하기 위해 EntityModel을 사용하고 Post에는 해당자원의 생성에 대한 201 상태코드를 제공하고 해당자원에 위치를 제공하기위해 ResponseEntity를 사용한것 인가요??Post에도 반환 값으로 EntityModel을 사용을 하는 경우도 있을까요??찾아보니 ResponseEntity<EntityModel<User>> 이렇게 사용하게 되는 경우 상태 코드와 함께 EntityModel<User>를 응답 본문으로 반환이 가능하다고 하는데 그렇다면 함께 사용하는 것이 데이터의 표현과 응답의 정확성을 높여줄것으로 예상이 되는데 이렇게 사용도 자주하는지 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 테스트 오류
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의내용과 동일하게 컨트롤+쉬프트+T 눌러서 JUnit4 선택하고 코드를 동일하게 쳤을때 이런 오류가 발생합니다 https://www.inflearn.com/questions/15495/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8F%84%EC%A4%91-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D링크에서 설정에서 run test를 intelliJ IDEA로 바꾸면 아래와 같은 오류입니다intellij IDEA로 변경 + 임포트를 jupiter.api.test 로 하면이런 오류입니다 run test를 default + 임포트를 jupiter.api.test로 하면이런 오류입니다....어떻게 해야 할까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
create 시 반환 타입 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]create시에 반환 타입을 Long 을 주는 실무적인 관점에서 이유가 뭘까요?? 어떤 경우에 좋은지 예를 들어 주실 수 있을까요??https://woojin.tistory.com/115#google_vignette에서는 아예 void 를 사용하지 말라고하는데 그 이유가 공감이 전혀 안됩니다.예를 들어 뭐 이런 건가요?? 주문 완료하기 버튼을 딱 누르면 생성된 주문 ID 가 딱 반환이되고 생성된 주문 ID를 바탕으로 조회해서 어떤 주문이 완료되었는지 표시해주게? 그러면 만약에 상품에 대한 평가를 남긴다고 하면 상품 평가 ID 를 반환해봤자 차피 바로 조회할 필요가 없어 보이는데 이러면 void 써도 되는 것 아닌가요??
-
미해결코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
실습. dto 변환해보기
변환도중 85line에서 NullPointException 오류메시지가 나와서 *.http테스트가 안됩니다. 85line 코드는 assertEquals(7, response.getExperienceYears().intValue()); 이고 아래와 같이 오류메세지가 나옵니다.Method invocation 'intValue' may produce 'NullPointerException' CreatePrince.kt에서 @NotNull @Min(0) val experienceYears: Int? = null,null 허용을 해줬는데 NPE를 뱉어서 문의드립니다
-
미해결스프링 배치
ItemStreamReader 중복실행관련 질문
저는 강의를 들으면서, 6번째에서 실패하면 6,7,8,9 이렇게 잡을 실행한다고 이해했는데 아래 코드와 같이 this.index == 7로 바꿨을때 6부터 시작하는게 아닌 5부터 시작하는데 의도한 설명이 맞을까요?? @Override public String read() { String item = null; if (this.index < this.items.size()) { System.out.println("read = " + index); item = this.items.get(index++); } if (this.index == 7 && !restart) { throw new RuntimeException("Restart is required!"); } return item; } // 1번째 실행 open update read = 0 read = 1 read = 2 read = 3 read = 4 update read = 5 read = 6 Exception : Restart is required! // 2번째 실행 open update read = 5 read = 6 read = 7 read = 8 read = 9 update update가장 최근에 실패한 지점부터 시작한다고 언급해주셨는데, 가장 최근에 실패한 Chunk부터 시작하는 것 같아서 원래 강사님께서 말씀하시려던 부분이 가장 최근에 실패한 Chunk부터 재실행 한다는게 맞을까요??맞다면, 중복실행이 될 수 있겠네요 read( ) 메서드에서는 ExecutionContext에 put을 하고 있는게 아니라서 클래스 내부변수 this.index가 변경되더라도 실제 DB에는 적용되지 않는 것 같네요.
-
미해결실습으로 배우는 선착순 이벤트 시스템
질문드립니다
1분 42초에 lock을 건다고 하는데 이게 어떤 lock을 건다는 의미인지 모르겠습니다.설명해주시기로는 범위로 락을 잡고 처음에 쿠폰 발급 여부를 가져와서 판단하는 방식입니다.라고 설명해주셨는데 여기서 lock이란게 뭐고 lock을 사용하는 이유가 뭔지 설명해주시면 감사하겠습니다.if문을 통해 확인한다는게 lock인건지 아니면 apply메서드 자체에 lock을 걸고 다른 프로세스가 접근하지 못하게한다는건지 모르겠내요유저 아이디별로 쿠폰 발급 개수를 한개로 제한할때 Redis에 Set자료구조를 써도되고 Map을 써도될거같은데 Set을 소개해주신 이유가 있을까요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
authentication관련 질문...
public void login(Account account) { System.out.println(account); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(account.getNickname(), account.getPassword(), Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"))); SecurityContextHolder.getContext().setAuthentication(token); }우선 AccountService에 있는 login입니다.제가 테스트를 하던 도중 나머지는 다 되는데 authetication부분에서 문제가 있는것을 발견했습니다. 단위테스트로 하다보니 권한이 부여가 되지 않아서 회원가입을 해도 다시 원상태로 복구되더군요 springsecurity6로 바뀌면서 새로 바뀐부분이 있길래 구글링해서 바꿀만큼 바꿔보고 찾을만큼 찾아봤다 생각했는데도자꾸 권한부여 부분에서 문제가 생깁니다(위의 login함수)이럴경우 어떻게 바꾸어야 할까요...? 저 위에 SecurityContextHolder.getContext().setAuthentication(token); 라는 코드전에 토큰을 출력해 보니UsernamePasswordAuthenticationToken [Principal=jungsik, Credentials=[PROTECTED], Authenticated=true, Details=null, Granted Authorities=[ROLE_USER]]이렇듯 AUtheticated는 true로 반환되는데 redirect될때는 권한이 사라지는것 같습니다