묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨
로컬에서 실행할 때 문제없이 잘 작동했고, ec2 서버에서 스프링부트 실행되는 것도 확인했습니다. 그리고 인바운드 규칙도 설정하고 public IP 주소로 입력했는데도 index.html 화면이 계속 로딩만 되고 안 나옵니다ㅜㅜ 해결 방법 있을까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
MemberDetail 테이블의 UK_MEMBER_DETAIL_PROFILE_ADDRESS 유니크 제약 조건과 관련해서 질문이 있습니다.39장 강의 마지막 부분에서, 해당 프로파일 주소(profile_address)를 빈 문자열로 바꿔 삭제할 수 있는 부분 테스트를 추가 하셨는데, 그런데 이렇게 되면 여러 사용자가 프로필 주소를 빈값으로 변경 할 경우 제약 조건에 충돌이 발생할 수 있을 것 같습니다.profile_address 값을 빈값으로 설정할 수 없도록 테스트를 조정하는게 더 맞아 보이는데 제가 생각한게 맞을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ItemUpdateForm 검증 관련 질문입니다.
1. 이 코드에서 결국 ItemUpdateForm 에 담기는 Long id 필드는 오로지 검증목적으로 사용하는 필드인거 같은데그러면 해당 DTO 용도가 "수정할 값"을 바인딩 하는 것 + 검증의 책임도 DTO에게 있다 라고 보면 될까요??2. update() 메서드에 검증한 DTO id를 꺼내서 사용하지 않고, @PathVariable을 사용하는 데 이유가 있는지 궁금합니다.
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
13강 강의 뒷부분의 과제 안내부분은 어디있나요?
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 13강 Redis 캐싱 시 발생하는 대표 문제 사례와 해결책3 2. 어려움을 겪는 부분어느 부분에서 막히셨나요?이력서에 써갈수 있는 이력 제시한다음에 다음강의에 실제 할수있는 과제가 있다고 써져있는데요. 왜 다음에 바로 강의 마무리가 되나요?? 뒷부분이 없어요
-
미해결스프링 핵심 원리 - 고급편
대상 클래스에 기본 생성자가 없을 때
제목과 같은 상황에서 어떻게 될지 궁금해서 테스트를 진행해봤습니다. @Component public class Test { public Test(MemberService memberService) { } } // ================================================= @Aspect public class TestAspect { @Before("execution(* hello.aop..*.*(..))") public void doTrace(JoinPoint joinPoint) { } } // ================================================= @Slf4j @SpringBootTest(properties = {"spring.aop.proxy-target-class=true"}) @Import(TestAspect.class) public class ProxyTest { @Autowired Test test; @Test void test() { log.info("class={}", test.getClass()); } }필드 test에 class=class hello.aop.test.Test와 같이 원본 객체가 주입된 것을 확인할 수 있습니다. 이러한 순서로 흘러가는 게 맞을까요?처음에 생성된 원본 Test 빈이 AutoProxyCreator에 전달된다포인트컷에 맞는 조건이므로 CGLIB로 프록시 생성 시도CGLIB 내부에서 원본의 기본 생성자를 (호출할 수 없어서?) (찾을 수 없어서?) -> return 원본결국 반환된 원본이 빈으로 등록 추가) 다음 강의를 듣고왔는데 이해가 안되는 부분이 있습니다.스프링 4.0부터 기본 생성자가 필수인 문제가 해결되었다고 하는데 왜 위의 테스트에서는 프록시 객체가 아닌 원본 객체가 주입되었나요?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
메타테이블에 데이터가 생기지 않는 이유
킬구형 내가 그동안 보면서 정리한내용으로, 실습을 진행해보려고 혼자 스스로 파일을 만들었어. 실습 환경은 h2 데이터 베이스로 테스트 했고,메타테이블은 자동으로 만들어졌어. 간단한 스텝과 잡을 만들어서 콘솔에서 잘 실행되는것 까지는 확인을 했는데 실제 데이터 베이스 테이블인 batch_job_instance와 같은 테이블에는 데이터가 들어가지 않아. 혹시 몰라서 db url도 확인해봤는데 정확하게 일치하고.. 이런경우는 어디를 확인해보면 제일 좋을까..? 콘솔에서 에러도 나지 않고 정상적으로 배치가 실행돼서 답답해 미치겠어 ㅠㅠㅠ콘솔에서 insert 쿼리는 안나가고 있는데, 쿼리가 왜 안나가는지를 도통 모르겠어 ㅠㅠ 다 잘되는데 메타테이블에만 데이터가 들어가지 않네.. 참고로 tasklet 방식으로 테스트 해봤어.부트 4.0.1 버전 사용하고 있어 킬구형 강의자료 에서도 중간에 postgresql로 전환하던데 혹시 h2는 뭔가 지원을 하지 않는걸까?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의
안녕하세요, 강사님.강의와 직접적인 내용은 아니지만, 사내에서 발생한 Spring Batch 오류와 관련해 조언을 구하고자 문의드립니다.혹시 시간이 괜찮으시다면 의견을 주시면 정말 감사하겠습니다. 1. 사용 환경Java 1.8Spring Boot 2.7.18Spring Batch 4.3.10 2. 문제 상황Spring Batch의 ExecutionContext에 한글 문자열을 저장한 이후,다음 배치 실행 시 아래와 같은 오류가 발생하며 Job이 지속적으로 실패하는 현상이 있었습니다.java.lang.IllegalArgumentException: Unable to deserialize the execution context at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow ~ Caused by: com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xb2 해당 Job은 chunk 기반 배치이며, 마지막 close() 시점에다음 Step에서 사용할 정보를 ExecutionContext에 저장하고 있었습니다.이때 ResultMsg: "정상 처리" 와 같이 한글 문자열을 저장한 이후부터 문제가 발생했습니다. 3. 원인 분석IDE(Eclipse) 인코딩: UTF-8DB 인코딩: NLS_CHARACTERSET = KO16MSWIN949BATCH_JOB_EXECUTION_CONTEXT 테이블에 데이터가 저장되는 구조로 확인했습니다.SHORT_CONTEXT (VARCHAR2(2500))SERIALIZED_CONTEXT (CLOB) 2500byte 이하의 데이터는 SHORT_CONTEXT에 저장되는데,해당 컬럼이 MS949 기반 VARCHAR2이다 보니UTF-8 기반으로 직렬화된 ExecutionContext 내 한글 데이터가 깨지면서다음 실행 시 역직렬화 실패가 발생한 것으로 판단했습니다. 4. 고민 중인 해결 방안현재 아래와 같은 방안들을 검토 중입니다.ExecutionContext에 한글 자체를 사용하지 않도록 제한로깅/메시지 성 데이터는 저장하지 않거나, 필요 시 영문만 사용ExecutionContext에 putString 시 인코딩 설정ExecutionContext 직렬화 방식 변경ExecutionContextSerializer를 DefaultExecutionContextSerializer 명시정으로 설정(Spring Batch 4는 기본적으로 JacksonExecutionContextStringSerializer) 5. 질문강사님께서 보시기에 위 상황에서 가장 권장되는 해결 방향 또는 실무적으로 안전한 접근 방식은 무엇이라고 생각하시는지 궁금합니다.긴 글 읽어주셔서 감사드리며, 가능하실 때 조언 주시면 많은 도움이 될 것 같습니다.감사합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
15강. updateUser() 질문
@PutMapping("/user") public void updateUser(@RequestBody UserUpdateRequest request){ String readSql = "select * from user where id=?"; String sql = "update user set name=? where id=?"; jdbcTemplate.update(sql, request.getName(), request.getId()); }웹페이지에서 update를 발생시켜서 put 요청이 올라 왔을때 UserUpdateRequest dto에 id와 name이 들어 간다는건 웹에서 요청이 올라왔을때 json에 이미 해당 name에 대한 id 정보가 있다는 거죠?id는 db에서 자동적으로 생성해 준다고 했었는데, 이 id를 웹에서는 어떻게 알고 있나요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 4-8강 2. 어려움을 겪는 부분어느 부분에서 막히셨나요?chapter4/_2_event_with_participant 폴더의 EventJoinService 객체의 메서드 코드에 대한 질문입니다.코드의 어떤 로직이 이해가 안 되시나요?@Transactional public void joinEvent(Long eventId, Long memberId) { Event event = eventRepository.findById(eventId) .orElseThrow(() -> new EntityNotFoundException("이벤트를 찾을 수 없습니다.")); Member member = memberRepository.findById(memberId) .orElseThrow(() -> new EntityNotFoundException("회원을 찾을 수 없습니다.")); // save()를 호출하지 않아도 Dirty Checking에 의해 Update 쿼리가 나가지 않나요? event.increaseParticipants(); eventRepository.save(event); EventParticipant participant = EventParticipant.builder() .event(event) .member(member) .build(); participantRepository.save(participant); } } 코드 블럭의 주석 란에 질문을 적어놓았습니다. 저 상황에서 save() 를 호출하는 이유가 궁금합니다.JPA 엔티티의 상태 변경분에 대한 쿼리는 트랜잭션 커밋 후, 자동으로 나가는 것으로 알고 있습니다. 혹시, 제가 잘못 알고 있는건지 궁금합니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
Repository Adapter 설계에 대해 피드백을 부탁드립니다
안녕하세요 토비님!!강의를 완강하고 제 프로젝트를 리팩토링하면서 피드백받고싶은점이 생겨 질문글을 올립니다.Repository Port를 기술에 종속시키지 않기 위해 Adapter에서 JPA, MyBatis, QueryDSL을 조합하는 구조를 선택했는데, 이 설계 방향이 적절한지 조언을 구하고 싶습니다.현재 구조 core/ └── domain/ └── application/ └── required/ ← Port 인터페이스 └── ~Repository adapter/ └── persistence/ ├── ~RepositoryAdapter ← Port 구현체 ├── ~JpaRepository ← Spring Data JPA └── ~MybatisMapper ← Mybatis 매퍼 인터페이스 의존 관계 [Service] → [Repository] ←impl― [RepositoryAdapter] → [JpaRepository] → [MybatisMapper] → [JPAQueryFactory] (core) (core) (adapter) (adapter) 예시@Repository @RequiredArgsConstructor public class ItemRepositoryAdapter implements ItemRepository { private final ItemJpaRepository itemJpaRepository; private final ItemMybatisMapper itemMybatisMapper; @Override public List<Item> findBySearchRequest(ItemSearchRequest request) { return itemMybatisMapper.findBySearchRequest(request) .stream() .map(Item::from) .toList(); } @Override public List<Item> saveAll(List<Item> items) { return itemJpaRepository.saveAll(items); } } @Repository @RequiredArgsConstructor public class AuctionRepositoryAdapter implements AuctionRepository { private final JPAQueryFactory jpaQueryFactory; private final AuctionJpaRepository auctionJpaRepository; @Override public void deleteAllByRegionAndRealmId(RegionType region, Long realmId) { QAuction qAuction = QAuction.auction; BooleanBuilder filter = new BooleanBuilder(); filter.and(qAuction.region.eq(region)); if (realmId == null) { filter.and(qAuction.realmId.isNull()); } else { filter.and(qAuction.realmId.eq(realmId)); } jpaQueryFactory.delete(qAuction) .where(filter) .execute(); } @Override public int saveAll(List<Auction> auctions) { if (auctions.isEmpty()) return 0; return auctionJpaRepository.saveAll(auctions).size(); } } 이 구조를 선택한 이유동적 쿼리, 벌크 연산 등 JPA만으로 해결하기 어려운 케이스가 있어 MyBatis와 QueryDSL을 병행 사용하고 있습니다.일반적인 방식인 Port 인터페이스가 Spring Data JPA Repository를 상속하는 구조를 채택하지 않은 이유:MyBatis나 QueryDSL 기반 구현체를 만들 수 없음CustomRepository 인터페이스를 별도로 만들어야 하는 복잡도 증가현재 방식의 장점:Port 인터페이스가 순수 Java 인터페이스로 유지됨RepositoryAdapter에서 상황에 맞는 기술을 자유롭게 조합 가능추가 인터페이스 없이 단순한 구조 유지저는 현재 구조가 의존 관계도 외부에서 내부로 향하고 테스트도 쉬워서 괜찮다고 생각하는데 토비님의 생각도 듣고싶습니다!! 좋은 강의 감사합니다!!
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
헥사고날 part2 강의 출시 예정일 문의 드립니다.
Part1 강의 너무 재미있게 봐서 Part2강의가 너무 기다려집니다. Part2 강의 출시가 언제쯤 되는지 혹시 계획이 있으신지 궁금합니다. 항상 좋은 강의해주셔서 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?
지난 강의에서 index.html을 만들고 이번에 hello-static.html을 만들어서 실행했는데 왜 새로 만들어진 html이 띄워지나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
22page 링크 주소 변경
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]22page 내의 링크를 클릭하면 제대로 된 응답을 받지 못하고 다른 페이지로 변경되는 것을 확인했습니다. 네트워크 탭 확인해보았을때 정상 응답 받지 못하는 것 같네요. 기존 링크: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#format변경된 링크: https://docs.spring.io/spring-framework/reference/core/validation/format.html
-
미해결Spring WebFlux + LLM 실전 구현
DTO 사용법에 대해서 궁금합니다!
강사님께서는 record가 아닌, 일반 class를 사용했는데! 혹시 이유가 있을까요~~!?!? 현업에서 물어보려해도ㅠㅠ... 주변에 시니어가 없는 환경이라... 딱히 물어보기가 어려워서요~~!!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Update 후 UpdateMemberResponse 매핑할 때
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]update하고 응답할 때 어차피 request dto에 응답할 파라메터 값이 담겨져있는데 해당 값을 response dto에 할당해서 응답하면 되지 않을까요? 즉 제가 구상한 코드는 다음과 같습니다. @Operation(summary = "회원 수정") @PutMapping("{id}") public UpdateMemberResponse updateMemberV1(@Validated @RequestBody MemberUpdateDTO memberUpdateDTO, BindingResult bindingResult, @PathVariable("id") Long id){ memberService.update(memberUpdateDTO, id); return new UpdateMemberResponse(id, memberUpdateDTO.getName(), memberUpdateDTO.getCity(), memberUpdateDTO.getStreet(), memberUpdateDTO.getZipcode()); }굳이 컨트롤러단에서 memberService.findOne(id)를 select문을 날려서 호출해서 준영속상태의 Member 엔티티의 값을 response dto에 할당하는 이유가 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 build test오류 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]클린도 해보고 다시 시도해보아도 test때문에 실패 한다네요.. 왜이럴까요..??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]실무에서 특정 데이터와 파일을 함께 DB 저장 시 파일 테이블의 구조를 아래 두가지 케이스중 어떤 케이스로 구성하는지 궁금합니다.(ex. A게시글과 A게시글에 대한 파일과 사진들 첨부 시)1) 파일 테이블(file_table)에 관련된 게시글의 타입(ref_type)과 id(ref_id) 컬럼을 만들어 저장하는 것.2) 게시글 테이블(board_table)에 관련된 파일 id(file_id) 컬럼을 만들어 저장하는 것.2개 이상의 파일 list를 저장하고 관리하기에는 1번 방법이 더 직관적인 것 같은데, 실제로는 2번과 같은 구조를 많이 본 것 같아서 질문 드립니다.실무에서는 보편적으로 어떤 구조를, 어떤 이유로 많이 사용할까요 ? 항상 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 관련 공부에 대한 조언을 얻고 싶습니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]솔직히 강의에 관련된 질문과는 거리가 먼 내용이어서 질문을 해야 하나 말아야 하나 고민하다가 결국 질문하는 게 좋겠다고 생각되어 질문을 올립니다. 강의 중에 강사님께서 중간중간에 test관련 공부를 열심히 해야한다고 하셨는데 혹시 어떤 식으로 공부해야 하는지 그리고 강사님께서는 어떻게 하셨는지, 또 추천하시는 서적이 있다면 그 서적의 제목이 어떻게 되는지 알고 싶습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 일단 현재 yml 강의 자료 기준으로는 trasaction rolled back에 대한 로그가 찍히질 않는데,해당 옵션을 추가해봤습니다. org.springframework.orm.jpa: trace #JPA 트랜잭션 관련 로그그랬더니 찍히긴 하던데 약간 이상하게? 찍힙니다.2026-01-07T02:05:57.767+09:00 DEBUG 5469 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Initiating transaction rollback 2026-01-07T02:05:57.767+09:00 DEBUG 5469 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Rolling back JPA transaction on EntityManager [SessionImpl(1610625797<open>)]혹시나 다른 옵션이 있을까? class가 아니라 SessionImpl? 이렇게 나오네요. 이건 제가 공식 문서를 봐봤는데, 다른분들께 도움이 될까 싶어서요, 나중에 자료도 업데이트 해주시면 좋을 것 같아요!https://github.com/gavlyukovskiy/spring-boot-data-source-decorator?tab=readme-ov-file#quick-start현재 저는 부트 4 버전을 사용중인데, 4버전 부터는 p6spy를 1.10.0 이 아닌 2.0.0으로 해줘야 합니다!implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:2.0.0'현재 자료 기준은 1.10.0이라 수정해 주시면 좋을 것 같습니다!(그리고 3버전도 1.12.1 로 올라갔습니다!) 사실 2번은 질문이라기 보다는 알려드리고 싶은 부분이었고, 1번만 트랜잭션 로그를 다르게 찍는 방법? 이 있는지 궁금합니다.
-
미해결3. 웹개발 코스 [스프링 프레임워크+전자정부 표준프레임워크]
신규강의 쿠폰 건
안녕하세요~ 강의를 구매했는데 신규강의가 있는 줄 미처 확인하지 못했네요loverain1541 지메일로 메일하나 보냈는데 확인 부탁드립니다