[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 안녕하세요? 환경 설정 중 org.springframework.boot:spring-boot-starter-aop 폴더가 없어 아래 코드를 build.gradle에 추가했으나 수업에서 다뤄주셨던 의존관계처럼 업데이트되지 않고 있습니다. 어떻게 해결해야 할까요? implementation 'org.springframework.boot:spring-boot-starter-aop' 강의 내용에서 나오는 이 부분과 같지 않습니다.
[질문 템플릿] 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 환경 변수를 별도로 설정해줘야 했음 저와 같은 문제로 헤매시는 분이 계시다면 도움이 됐으면 좋겠습니다. 혹시나 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다!
servlet-context.xml, root-context.xml 아무리 쳐다봐도 web.xml에서 servlet-context.xml 경로 잘못 불러오면(제 경우에는 이랬음) controller가 service클래스를 의존성 주입을 못 해주더라고요. web.xml의 설정이 어떤 영향을 미치는지도 잘 학습해두면 좋습니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 강사님께서 for 문에서 i < studentCount; 를 사용하셨는데, studentCount 대신에 scores.length를 사용해도 같은 답이 나옵니다. 마찬가지로 j < 3; 에서 3 대신에 scores[i].length 나 subjects.length를 사용해도 같은 답이 나옵니다. 혹시 코드가 똑같이 실행되더라도 studentCount 를 사용하시는 이유가 있는건가요? 어떤 것을 사용해야 가장 좋은지를 어떻게 판단할 수 있는지 알려주시면 감사하겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 어떤 걸로 강의하시는지는 모르겠는데 강의하시는 자료 화면을 같이 띄워 놓고 수강하고 싶어서요. 혹시 어느 사이트에 들어가야 확인 할 수 있나요?
[질문 내용] 안녕하세요, 영상에서 영한님이 "메서드를 전달"하라고 하시기에 다음과 같이 풀어봤는데, 영한님 풀이와는 접근 방법이 조금 다른 것 같아 문의드립니다. 제가 봤을 때는 영한님 풀이의 경우 "메서드를 전달" 한다는 느낌보다는 "메서드를 구현해놓은 인스턴스를 전달" 한다는 느낌으로 받아들여져서 질문드립니다. 다음과 같이 풀이해도 익명 클래스의 목적에 부합하는 풀이일까요? 추가로 강의록에 "그런데 지금까지 학습한 내용으로는 메서드를 전달할 수 있는 방법이 없다." 라고 언급되었는데 이는 결국 "(아직 학습하지 않았지만) 메서드를 전달할 수 있는 방법이 존재한다." 라고 해석되고, 이에 해당하는 방법이 아래 풀이와 같은 방법인지 궁금합니다. // my solution-2 package nested.anonymous.ex; import nested.local.Process; import java.util.Random; public class Ex1RefMainSOL2 { public void process(Process process) { System.out.println("프로그램 시작"); process.run(); System.out.println("프로그램 종료"); } public static void main(String[] args) { Ex1RefMainSOL2 main = new Ex1RefMainSOL2(); main.process(new Process() { int randomValue = new Random().nextInt(6) + 1; @Override public void run() { System.out.println("주사위 = " + randomValue); } }); main.process(new Process() { @Override public void run() { for (int i = 1; i <= 3; i++) { System.out.println("i = " + i); } } }); } }
❗ 질문 작성시 꼭 참고해주세요 현재 문제(또는 에러)와 코드(또는 github) 를 첨부해주세요. 맥/윈도우, 안드로이드/iOS, ReactNative, Node 버전 등의 개발환경 을 함께 적어주시면 도움이 됩니다. 에러메세지는 일부분이 아닌 전체 상황 을 올려주세요. ( 일부만 자르거나 복사하지말아주세요 .) 개발환경/코드에 대한 정보가 없을경우 답변이 어렵습니다. 다시 따라해보는중인데 npx react-native@0.72.6 init ykservice --version 0.72.6 로 할경우 cocoapods 설치시 boost 설치 실패에러가 발생합니다. 0.72.6 으로 진행하려면 아래 링크 참조하여 수정하면 가능합니다. https://github.com/boostorg/boost/issues/843#issuecomment-1872943124 근데 인퍼런은 수업별로 질문게시판이 있으면 좋겠네요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] (자바 기본 - NullPointerException강의 입니다) 제목 그대로 NullMain3.java파일에서 System.out.println(" bigData.data .value=" + bigData.data .value);코드를 보면요. value라는 필드가 없는데 0이 출력되는 이유가 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 어제인가 그저께인가, 이 생각이 계속 떠나지 않아서 글을 쓰게 되었습니다. 말 그대로 영한 님의 개발 커리에 대해, 다음 행보가 궁금해져서 질문을 드립니다. 1. 자바 강의 및 DB강의를 끝나고 다음 강의로는 무엇을 하실 건가요? 아니면 다시 실무로 가실 건인지? 2. 자바 강의를 끝나고 DB를 하신다는 기억이 있는데, DB 강의 때에, 어떤 종류의 sql을 이용할 생각 인가요? 답변 부탁 드립니다.
마지막 강의에서 이불러 인가서버 access token을 1초만에 만료 시키는 설정을 하고 리소스 서버로 expire 엔드 포인트를 호출 하였는데 여기서 bearer 인증 필터를 거치는데 여기서 jwt 토큰을 decoder로 검증할 때 토큰이 만료되어 검증이 실패하지 않나요? 강의에서는 바로 컨트롤러 엔드 포인트까지 도달 하고 클라이언트까지 응답이 갔습니다.
안녕하세요 낙관적 락을 활용해서 조회수 증가 동시성 테스트를 하고 있습니다! 영상처럼 동일하게 로직을 작성해서 테스트 하는데 동시성 처리가 전혀 안되는 상태라 질문 드립니다ㅜㅜ 아래는 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으로 나오는데 원인을 도저히 모르겠습니다ㅜㅜ
안녕하세요 강의 초반에 oauth2Login api를 사용하여 클라이언트에서 token 요청 후 scope email, profile 이렇게 userinfo 엔드포인트 요청 시 인가 서버에서 해당 요청을 받아서 리소스 서버에게 토큰 검증을 맡기고 검증을 성공하게 되면 리소스 서버에 저장된 사용자 정보를 바로 클라이언트에게 전송하나요? 아니면 다시 인가서버로 전송하나요? 만약 scope에 openid가 포함이 안되어 있다면 인가 서버에서 토큰 검증을 수행 후 사용자 정보를 안주는 거 같은데 우리가 보통 사용하는 google, 카카오 네이버 이런 거는 포함 안 시켜도 줬는데.. 또 강의 초반에는 키클록을 사용했는데 이건 키클록 구현과는 좀 틀린가요?
질문은 아니고, 수강하시는 분들에게 도움이 되고자 제가 풀이한 또 다른 방식 공유합니다. package time.test; import java.util.Scanner; import java.time.LocalDate; import java.time.DayOfWeek; public class TestCalendarPrinter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("년도를 입력하세요: "); int year = sc.nextInt(); sc.nextLine(); System.out.print("월을 입력하세요: "); int month = sc.nextInt(); sc.nextLine(); printCalendar(year, month); } private static void printCalendar(int year, int month) { // 사용자 입력에 따른 LocalDate 객체 생성 LocalDate ld = LocalDate.of(year, month, 1); // 요일 표지 출력 System.out.println("Su Mo Tu We Th Fr Sa"); for (int i = 0; i < ld.lengthOfMonth(); i++) { // 해당 월의 1일에 해당하는 요일을 감지하고, 이에 따라 출력 시작 위치를 지정 // ld.getDayOfWeek().getValue()는 해당 날짜의 요일 값을 int로 리턴 Sunday(0), Monday(1) if (i == 0) { for (int j = 0; j < ld.getDayOfWeek().getValue(); j++) { System.out.print(" "); } } // 다음 일을 출력. startPosition은 위에서 맞췄으므로 단순 포맷팅 출력만 하면 됨 LocalDate currentLd = ld.plusDays(i); System.out.printf("%2d ", currentLd.getDayOfMonth()); // Saturday 출력 후에는 다음 줄로 이동 if (currentLd.getDayOfWeek() == DayOfWeek.SATURDAY) { System.out.println(); } } } }
[질문 내용] OrderServiceTest에서 테스트 메서드를 실행하면서 H2 DB에 쿼리가 들어가는지 확인하기 위해 Test 폴더 안에 resources를 지우고 상품주문 테스트 메서드 안에 RollBack(value = false), em.flush()를 통해서 실제 데이터가 들어가는것을 확인하였습니다. 그런데 다시 원래대로 돌리는 과정에서 Test폴더 안에 resource를 만들고 해당 테스트의 application.yml를 돌려났음에도 불구하고 실행했음에도 H2 DB 안에 데이터는 그대로 남더라고요. 그래서 RollBack(value = false), em.flush()를 지우고 다시 실행해도 계속 데이터가 남는데 어떻게 해결하면 좋을까요?