묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
오류 도와주세요 ..제발 도와주세요 ㅠㅠ
어제까지 잘 됐는데 갑자기 오늘부터 서버실행시 오류가 나는데 찾아봐도 모르겠어서 남깁니다 .. 제발 도와주세요.다음 진도를 못 나가고 있습니다 ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드에서 @Transaction사용 시 delete 쿼리가 나가지 않습니다.
안녕하세요. 강의를 수강하며 따로 게시판을 만들어보는중에 문제가 발생하여 질문드립니다.다름이 아니라 테스트 코드 작성중에 em.delete()를 사용하는 부분에서 궁금증이 생겨 질문 남깁니다.아래는 테스트 코드가 작성 된 부분입니다.회원을 만들고 게시글을 작성하고 이 게시글을 삭제하도록 하였습니다.PostService의 deletePost, PostRepository의 delete를 사용하여 게시글의 id를 입력받아 삭제하는 구조로 작성하였습니다.여기서 테스트를 실행 시키면 테스트가 실패합니다. 기대값은 0인데 실제로 1이되어 있다고 나옵니다.로그를 통해 확인해보면 delete 쿼리가 작동하지 않았습니다. 하지만 테스트 클래스의 @SpringBootTest아래의 @Transactional을 삭제하고 실행 시키면delete 쿼리가 작동하고 테스트가 정상 동작합니다. @Transactional을 사용하면서 delete문이 제대로 작동하도록 할 수 있을까요?웹 서핑을 하며 테스트 해본 것입니다.1. em.flush()2. @Rollback(value=false)
-
해결됨[실습] 대기업 근무하며 경험한 Redis를 야무지게 사용하기
value 에 gson.toJson 사용 관련
value 에 대해서 모두 gson.toJson 을 통해 직렬화를 해서 저장하고 있는데요. 이건 value 가 json 이 들어간다고 가정하고 이렇게 작성하신걸까요? 일반적인 경우에는 json 이 아닌 경우도 있을것 같아서 여쭤봅니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MVC와 템플릿 엔진 강의에서 질문이 있습니다~
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 해당 강의 내용중에@GetMapping("hello-mvc")public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template";} 이와같이 HelloController에 새로운 메서드를 추가하고 @RequestParam 어노테이션을 사용해서 요청 url에서 ?를 사용해서 파라미터를 받게 되는데요. 1)@RequestParam에 command+B를 이용해서 인텔리제이로 소스코드를 보면, RequestParam이 인터페이스로 되어있는데 그렇다면 구현체는 어디에 있다고 보면 될까요? 구현체를 확인할 수 있는 건가요? 2)HelloController에서 @RequestParam("name") 이렇게만 코드를 입력했을 때, RequestParam 인터페이스에서 String name() 값이 "name"이 되었다고 보면 되는 걸까요? 그렇다면 그걸 어떻게 알 수 있는 건가요? 왜냐면 RequestParam 인터페이스에는 모든 메서드가 default값을 가지고 있더라구요. 3)이렇게 @RequestParam을 사용한 파라미터가 "쿼리 파라미터"이고 ?을 사용한다고 생각하면 될까요? 이거말고 path 파라미터 이렇게 2가지라고 알고 있습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
소스코드 어디서 가지고 오나요?? 저는 안보던데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]소스코드 메뉴얼??이라는곳에서 복사붙여넣기 하시는거같은데 저는 강의 옆부분에 구름모양도 없는데 방법이 있을까요??
-
미해결코드로 배우는 스프링 웹 프로젝트 - Basic
Spring XML 설정 파일 만들기
XML Configuration File 버튼만 안보이는데 어떻게 해결해야 하나요? 유료 버전 사용하고 있습니다.
-
미해결토비의 스프링 부트 - 이해와 원리
binding error
질문 전 말씀드리면, Kotlin + Spring Boot를 사용하고 있습니다. Datasource Connection Test 코드를 작성하고 테스트할 때 application.yml에서 properties 객체로의 binding시 이슈가 있습니다.정확하게는 prefix가 존재할 때 binding시 String에서 Properties 객체로 binding을 시도하다가 에러가 발생하고 있고, application.properties 해당 문제가 발생하지 않음과 달리 application.yml에서 prefix 존재하는 경우 발생하고 있습니다.혹시, 강의에서 진행해주셨던 postProcessAfterInitialization의 내부 로직에서 application.yml + prefix 조합에서의 별도 처리가 필요한걸까요?binding error를 확인하기 위해 작성한 테스트 코드는 아래와 같습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
org.springframework.boot:spring-boot-starter-aop 폴더가 없는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요? 환경 설정 중 org.springframework.boot:spring-boot-starter-aop 폴더가 없어아래 코드를 build.gradle에 추가했으나 수업에서 다뤄주셨던 의존관계처럼 업데이트되지 않고 있습니다.어떻게 해결해야 할까요?implementation 'org.springframework.boot:spring-boot-starter-aop' 강의 내용에서 나오는 이 부분과 같지 않습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew 빌드 시 환경변수 에러 해결
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저 뿐만 아니라 많은 분들이 gradlew 빌드 시 환경 변수 관련 에러가 발생하여 삽질하다가 해결하여 공유드립니다.저의 경우 gitBash로 ./gradlew 명령어를 입력했을 때 환경 변수 설정 관련 에러가 발생했는데 아래와 같이 해결했습니다. 해결 과정환경 변수 설정에서 JAVA_HOME 변수의 값과 Path에 추가해야 하는 %JAVA_HOME%\bin 확인했으나 정상적으로 설정되어 있는 상태예전에 사용한 zulu jdk과 충돌이 의심되어 모두 제거 했으나 해결되지 않음InteliJ - File - Project Structure - Platform Settings - SDKs 목록에서 직접 설치한 Oracle JDK만 남기고 zulu jdk 등 제거 후 적용했으나 해결되지 않음InteliJ - File - Settings - Build, Execution, Deployment - Build Tools - Gradle에서 Gradle JVM을 직접 설치한 Java 버전으로 설정했으나 해결되지 않음gitBash를 열고 홈 디렉토리에서 .bashrc에 접근하여 환경 변수를 아래와 같이 수정 및 적용하여 문제 해결export JAVA_HOME="/c/Program Files/Java/jdk-17" export PATH="$JAVA_HOME/bin:$PATH" 결론내 OS(Windows)의 시스템 환경 변수에서는 JAVA_HOME과 PATH 환경 변수를 정상적으로 설정했으나 gitBash는 Windows의 시스템 환경 변수와는 별개로 자체적인 환경 변수를 관리하기 때문에 gitBash 내부에서 JAVA_HOME과 PATH 환경 변수를 별도로 설정해줘야 했음 저와 같은 문제로 헤매시는 분이 계시다면 도움이 됐으면 좋겠습니다. 혹시나 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외 500과 400번대
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이번 강의 초반에 강사님께서 말씀해주셨던 것에서,서블릿 컨테이너는 예외가 들어왔을 때 기본적으로 500 에러를 내뱉도록 시스템화되어 있다고 말씀하신는 것처럼 들리는데,그럼, 서버에서 400번대 에러코드를 내뱉는 것은,예외처리 리졸버나 그외 다른 예외 처리 로직 등에서 400번대로 변환했기 때문이라고 이해하면 될까요?즉, Default는 500이고, 처리 여부에 따라 400번대 가능
-
해결됨코드로 배우는 스프링 웹 프로젝트 - Basic
[질문아님] 4~6분 쯤에 web.xml 설정 잘 해주세요!
servlet-context.xml, root-context.xml 아무리 쳐다봐도 web.xml에서 servlet-context.xml 경로 잘못 불러오면(제 경우에는 이랬음) controller가 service클래스를 의존성 주입을 못 해주더라고요.web.xml의 설정이 어떤 영향을 미치는지도 잘 학습해두면 좋습니다!
-
해결됨토비의 스프링 6 - 이해와 원리
토비님 ! BigDecimal 관련 링크를 못찾겠어요
테스트와 DI(1)에서 10:50초에 말씀하셨던BigDecimal과 관련된 읽어보면 좋은 링크를 걸어주신다고 하셨는데 참고 자료에서 못찾겠습니다 ☹ 그래서 혹시 다른 곳에 링크가 있는지 여쭤봅니다 !!
-
미해결스프링 시큐리티 OAuth2
jwt decoder 토큰 검증 시 질문
마지막 강의에서 이불러 인가서버 access token을 1초만에 만료 시키는 설정을 하고 리소스 서버로 expire 엔드 포인트를 호출 하였는데 여기서 bearer 인증 필터를 거치는데 여기서 jwt 토큰을 decoder로 검증할 때 토큰이 만료되어 검증이 실패하지 않나요? 강의에서는 바로 컨트롤러 엔드 포인트까지 도달 하고 클라이언트까지 응답이 갔습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
BaseEntity 에서의 abstract 사용이유
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요.BaseEntity에 abstract를 사용하는 이유에 대해 궁금합니다.강의 중에 흐르듯이 듣기는 했지만, 조금 더 자세히 이유에 대해 파악하고자 질문드립니다. 아니면, 강의에서 내에 말씀해주신 인스턴스를 굳이 만들필요없기 때문이 전부인지 궁금합니다.감사합니다
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락 테스트 실패
안녕하세요 낙관적 락을 활용해서 조회수 증가 동시성 테스트를 하고 있습니다! 영상처럼 동일하게 로직을 작성해서 테스트 하는데 동시성 처리가 전혀 안되는 상태라 질문 드립니다ㅜㅜ아래는 Board 엔티티입니다!import jakarta.persistence.*; import lombok.Getter; @Getter @Table(name = "board") @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @Column(name = "view") private long view; @Version private Long version = 0L; public Board(String title, long view) { this.title = title; this.view = view; } public void increaseView() { this.view += 1; } public Board() { } } 서비스 로직입니다! Catch 부분을 전혀 타지 않는 상태인거 같습니다 @Transactional public void increaseViewCountOpticLock(final long boardId) throws InterruptedException { while (true) { try { Board board = boardRepository.findByIdWithOptimistLock(boardId); board.increaseView(); // 조회수 증가 boardRepository.save(board); // 저장 break; // 성공 시 루프 탈출 } catch (ObjectOptimisticLockingFailureException e) { log.info("========================="); Thread.sleep(50); } } } import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.tkdgus.concurrdemo.entity.Board; public interface BoardRepository extends JpaRepository<Board, Long> { default Board getBoardById(long boardId) { return findById(boardId).orElseThrow(IllegalArgumentException::new); } @Lock(LockModeType.OPTIMISTIC) @Query("SELECT b FROM Board b WHERE b.id = :boardId") Board findByIdWithOptimistLock(long boardId); } DB는 MySQL이고 트랜잭션 격리 수준이나 이런건 다 기본 설정 그대로입니다! @Test @DisplayName("낙관적 락 동시성 테스트") void increaseViewCountOptimisticLock() throws InterruptedException { long boardId = 1L; int concurCnt = 100; ExecutorService executorService = Executors.newFixedThreadPool(32); CountDownLatch latch = new CountDownLatch(concurCnt); for (int i = 0; i < concurCnt; i++) { executorService.submit(() -> { try { boardService.increaseViewCountOpticLock(1L); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { latch.countDown(); } }); } latch.await(); BoardDto afterBoard = boardService.findBoard(boardId); assertThat(afterBoard.view()).isEqualTo(concurCnt); }위 테스트 코드로 테스트 하면 100이 아니라 항상 10으로 나오는데 원인을 도저히 모르겠습니다ㅜㅜ
-
해결됨스프링 시큐리티 OAuth2
클라이언트에서 userinfo 엔드포인트 호출 시 질문
안녕하세요강의 초반에 oauth2Login api를 사용하여클라이언트에서 token 요청 후 scope email, profile 이렇게 userinfo 엔드포인트 요청 시인가 서버에서 해당 요청을 받아서 리소스 서버에게 토큰 검증을 맡기고 검증을 성공하게 되면 리소스 서버에 저장된 사용자 정보를 바로 클라이언트에게 전송하나요? 아니면 다시 인가서버로 전송하나요?만약 scope에 openid가 포함이 안되어 있다면 인가 서버에서토큰 검증을 수행 후 사용자 정보를 안주는 거 같은데 우리가 보통 사용하는 google, 카카오 네이버 이런 거는 포함 안 시켜도 줬는데.. 또 강의 초반에는 키클록을 사용했는데 이건 키클록 구현과는 좀 틀린가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ServletApplication 관련 오류
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.ServletApplication을 Run을 하고 Stop버튼을 누르게 되면 이런 화면의 오류가 나옵니다. 그런데 프로그램에 동작에 문제는 있지 않습니다. 혹시 정지를 누르게 되면 왜 이런 오류가 나는 걸까요?
-
미해결스프링 핵심 원리 - 기본편
테스트 할 때 왜 다른 파일의 오류에 영향을 받는건가요??
[질문 내용]RateDiscountPolicyTest를 할 때 10퍼센트로 할인율이 변경되었으니 Order.java 파일의 calculatePrice도 변경되어야 할 줄 알고 주석처리를 했는데 관련 없는 파일에서 오류가 나서 테스트 실행이 안 됩니다. calculatePrice를 주석 처리하고, 저 코드를 쓰는 모든 코드들을 주석처리 하니 오류가 안나고 테스트가 잘 돌아갑니다. 원래 테스트를 할 때 테스트와 관련 없는 파일의 오류가 있으면 테스트가 작동되지 않는 건가요?
-
미해결스프링 핵심 원리 - 기본편
프로젝트 빌드가 안되는 이유가 뭘까요??
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]현재 맥 OS를 사용하고 있습니다. 강의를 듣는 도중 인터페이스로 변경하면서 테스트를 진행했을때, 객체 주입이 안된 상태이기 때문에 NullpointException이 발생해야하는데 변경사항이 아닌 이전 버전으로 실행되가주고 테스트 성공으로 뜹니다. 이걸 해결하기 위해서는 변경사항이 있을때마다 프로젝트를 재빌드해야하는데 데스크톱에서는 바로 반영되가주고 빌드를 매번 할필요가 없는데 해결방안이 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api/v1/members 404 에러 질문입니다.
[질문 내용] 왜 404 에러가 뜨는지 모르겠네요 ㅠㅠ도움 요청합니다.