묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
낙관적락 vs 네임드락
낙관적락과 다르게 네임드락은 재시도 로직이 필요 없나요?낙관적락은 충돌이 빈번하다면 재시도 로직으로 인해 비관적락보다 성능이 떨어질 수 있는데, 네임드락은 어떤가요?
-
미해결스프링 시큐리티 OAuth2
Spring Authorization Server 활용 sso 구축
Oauth를 활용해 자체 sso 서버를 구축하려고 하는데 궁금한 게 있어 문의 드립니다.먼저 구축할 예정인 환경은 아래와 같습니다.로그인 프론트 Authorization과 로그인을 함께 처리할 백엔드 authorization code 요청 시 로그인 여부를 확인해야 하는데 로그인 정보가 jwt 토큰으로 cookie에 담겨있다면, OAuth2AuthorizationEndpointFilter에서 확인을 해야하는지 OAuth2AuthorizationCodeRequestAuthenticationConverter에서 확인을 해야하는지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
spring sync connection reset
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) Spring 환경설정 질문 입니다.2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네, 기존 Q&A에 없는 것 같습니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]안녕하세요. 초보 spring 입문자 입니다.강의 1. 프로젝트 환경설정 단계 질문입니다.강사님께서 말씀하신 스프링부트 스타터 사이트로 부터 해당 hello-spring 프로젝트 생성을 했습니다.이후 Intellij에서 project로 열면 spring library를 받아와야 할텐데 받질 못하고 있습니다. load Gradle project 를 누르면 hello-project:failed > Connection reset 알람이 뜨네요. 참고로 회사 사무실 PC 환경에서 발생하는 이슈이고,자택에서 사용시에는 잘 됩니다. 회사 방화벽 문제 일까요 ? 감사합니다.
-
미해결김영한의 실전 자바 - 기본편
객체 생성과 메서드 호출에 대한 메모리 관점 흐름에 대해 질문 있습니다.
메서드 프레임은 메서드 영역에 있는 메서드 코드를 기반으로 생성되나요?객체 생성과 메서드 호출에 대한 메모리 관점 흐름을 정리 해봤는데 맞게 정리한건지 궁금합니다. "객체 생성시 힙 영역에 객체 저장 -> 메서드 호출시 메서드 영역에 있는 호출한 메서드 코드를 찾음 -> 찾은 메서드 코드로 스택 영역에 메서드 프레임을 생성함"힙 영역에서 메서드 영역에 있는 본인의 메서드 코드를 어떻게 찾는지 궁금합니다.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
this에 대해 질문 있습니다.
객체를 생성하는 순간 힙 영역에 객체가 저장(필드값)된다고 알고 있습니다. 메서드를 호출하기 위해서는 우선 객체를 생성한 후에 메서드를 호출해야 한다고 생각합니다. 궁금한 부분은 언제 메서드 프레임의 this에 값이 저장 되는지 궁금합니다. 메서드 호출 할때 힙 영역에 저장되어 있는 객체의 주소값이 this로 저장이 되는건가요?
-
해결됨Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Backpressure Drop 전략에서 다시 버퍼가 채워지는 시점에 대한 질문입니다.
안녕하세요 강사님. 오늘 Backpressure Example 코드 강의 수강 후 Backpressure Drop 전략에 대해 궁금했던 부분은 다른 분의 질문을 통해서 해결을 할 수 있었습니다.(질문 글 Link) 해당 글에서 강사님의 답변을 보면Drop 전략의 경우, 버퍼 안의 데이터가 Subscriber에게 한개 전달되면, 버퍼 공간이 한개 비니까 한개의 데이터가 채워지는것이 아니라 전체 버퍼 중에 70-80 퍼센트 정도(정확한 비율은 나중에 확인 후 말씀드릴게요)가 한번에 비워진다고 보시면 될것 같습니다.즉, 데이터 한개가 버퍼에서 비워지는 것이 아니라 버퍼가 가득찬 상태에서 Downstream이 데이터를 처리할 수 있는 상태가 될 때까지 Upstream에서 emit된 데이터는 Drop이 된다고 생각하시면 될것 같습니다.이런 부분이 있는데 혹시 어떤 파일의 어떤 메서드를 보면 해당 내용을 알 수 있을까요 ? ※제가 혼자서 디버그를 통해서 찾아보려고 했는데 잘 찾아지지가 않아서 여쭤봅니다. 😢
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
main 스레드와 생성한 스레드 관계에 대해 질문 있습니다.
자바 실행 시 main 스레드가 생성되고 실행이 되다가 중간에 아래와 같이 스레드를 하나 생성한다고 하겠습니다.MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start();이럴 경우 생성한 스레드가 종료 상태가 될때 까지 main 스레드가 기다리는지 아니면 main 스레드는 생성한 스레드의 상태와 아무 관련없이 종료 상태가 되는지 궁금합니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
포인터의 개념과 활용
15:25 예시 세번째 질문입니다.문자열의 길이 계산에서length는 0으로 선언되었는데str[length]는 위에있는 Hello, World! 문자의 길이에 맞춰서 length 값을 1씩 증가하되 시작점이 0이라는 걸까요?널값을 어떻게 만난다는건지 잘 이해가 안가서요. 문자열 길이계산부분만 다시 설명 부탁드립니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
배열과 문자열
10:11초 정도질문입니다.[]대괄호안에 숫자가 들어가면, 문자배열의 공간수로 이해하였는데, 공란은 무슨의미인가요?공란이있거나 숫자가 았거나 똑같이 풀이가되어 헷갈립니다.그리고 %s 변수는 널값 ‘\0’ 이 나올때까지 문자 배열대로 쭉 출력하여야 하는데, 이게 항상 생략되는건가요? 생략되는 경우가 따로있나요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
변수명명규칙 - 패키지명
안녕하세요. 강의 잘 듣고 있습니다. 섹션 3, 변수명명규칙 강의에서 패키지명은 소문자를 사용한다고 하셨는데, 카멜케이스가 아닌 전체를 소문자로 사용하는 것이 맞나요? 예를 들어 org.springBoot -> org.springboot로 표기하는것이 맞나요?
-
미해결실전! 스프링 데이터 JPA
17:00 분 경에 적으시는 @Bean은 꼭 main메서드가 있는 곳에서 작성해야 하나요>?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 config클래스를 따로 파서 거기에 만들어도 적용이 되는 건가여? 만약에 된다고 하면 둘중 어떤 식으로 많이 사용하나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy와 r2dbc 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 지금 엔티티 클래스 개발2 강의 수강 중입니다.해당 강의 7분 20초 즈음 JpashopApplication 클래스 실행시키는 부분에서 런타임 에러가 발생하여 질문을 올리게 됐습니다. 처음 뜬 오류는 Caused by: java.lang.IllegalStateException: Could not evaluate condition on com.github.gavlyukovskiy.boot.jdbc.decorator.flexypool.FlexyPoolConfiguration$PropertyFlexyConfiguration due to com/vladmihalcea/flexypool/util/ClassLoaderUtils not found. Make sure your own configuration does not rely on that class. This can also happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake) 이었습니다. 구글링과 chatgpt를 사용해 해결방법을 모색하였고 p6spy를 사용하려면 flexypool이 필요없다는 사실을 확인 했지만 오류 메세지에 맞추어implementation 'com.github.gavlyukovskiy:flexy-pool-spring-boot-starter:1.9.0' 을 build.gradle에 추가해 해결하려고 했습니다. 하지만 이번에는 'Caused by: java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations$PoolConfiguration due to io/r2dbc/spi/ValidationDepth not found. Make sure your own configuration does not rely on that class. This can also happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)' 오류가 발생하는 걸 확인할 수 있었습니다. 이번에도 구글링 및 chatgpt를 통해 해결방법을 찾아보려 했는데, JPA를 사용하면 R2DBC 관련한 모듈을 추가할 필요가 없다는 걸 확인할 수 있었고 아예 잘못된 방향으로 해결방법을 모색하고 있다는 걸 확인했습니다. 3. 현재 작성중인 코드에 flexy-pool을 사용하는 코드가 있나 점검해보았습니다. ./gradlew clean build .application.yml 점검build.gradle 점검./gradlew dependencies 를 통해서 의존관계 확인하지만 문제가 되는 부분을 찾을 수는 없었습니다. 어디서부터 잘못된건지, 해결 방법은 무엇인지 알려주시면 감사하겠습니다. 파일 링크 : https://drive.google.com/file/d/1kWHwYUf8akxBlG1Wdn6D_1WQbnRw8uzR/view?usp=sharing감사합니다.
-
해결됨김영한의 실전 자바 - 중급 1편
ghuhan18님이 질문한것중 OMG님이 대답의 대한 질문.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. ghuhan님의 질문 내용과 OMG님의 답변 내용을 보면서, 궁금증이 생겨서 질문을 남깁니다.OMG님의 답변 내용을 보면서 그 내용 중 '코드 규모가 커지고' 라는 말이 있습니다.만약에 ghunhan님의 말처럼 지역 클래스 로 만들었는데, 어느 정도 코드 규모가 커져서 별도의 클래스 를 만들어야 한다는 상황이 생겻다면,(지역 클래스에서 그냥 일반 클래스로 전환)어느 정도 코드 큐모가 커야지? 별도의 클래스를 만들겟다는 생각이 드는지요?각각 사람들이 생각하는 코드의 규모가 있을 텐데요, 아직 저로서는 어떤 게 코드 규모가 큰지 생각을 할 수 없네요.수정 : 너무 말이 이상해서 수정을 좀 많이 하네요. 수정 하시기전 보신 분들 좀 죄송합니다. 답변 부탁 드립니다.
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
이분탐색(매개변수 탐색) 질문 있습니다!
while문 조건에서,(lt < rt)와 (lt <= rt) 두 조건 중 어느것을 사용해야 하는지 판단 기준이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
update 로직 질문
멤버 업데이트 시memberService.update(id, request.getName());으로 작성해 주셨는데memberService.update(id, request);와 같이 객체를 통째로 넘기지 않는 이유가 있는 것인가요? 위와 같이 객체를 통째로 넘기는 경우 UpdateMemberRequest 클래스를 이너 클래스가 아닌 별도의 클래스로 분리해 줘야 하는 게 맞나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.어떤 점이 문제인지 모르겠습니다 ㅜ jdbcMemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class JdbcMemberRepository implements MemberRepository{ private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if(rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } } MemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); void finById(Long id); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); void cleatStore(); }MemoryMemberRepositorypackage hello.hello_spring.repository; import hello.hello_spring.domain.Member; import java.util.Map; import java.util.Optional; import java.util.*; public class MemoryMemberRepository implements MemberRepository { public static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId((++sequence)); store.put(member.getId(), member); return member; } @Override public void finById(Long id) { } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable((Member) store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public void cleatStore() { } void clearStore() { store.clear(); } }errorerror: JdbcMemberRepository is not abstract and does not override abstract method cleatStore() in MemberRepository public class JdbcMemberRepository implements MemberRepository{
-
미해결김영한의 실전 자바 - 중급 2편
제네릭클래스는 타입매개변수를 통해 타입을 결정하는데 이 타입을 메인에서 전달받는다면 의존성 주입과 IoC로 볼수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제네릭클래스는 타입매개변수를 통해 타입을 결정하는데 이 타입을 메인에서 전달받는다면 의존성 주입과 IoC로 볼수 있나요?제가 생각하는 IoC는 한 오브젝트에서 무언가를 결정해야하는데 이것이 다른 오브젝트에 의해 결정되는 것입니다.이때 제 기준으로는 제네릭클래스는 내부적으로 타입을 결정해야하지만 이 타입이 메인과 같은 함수에 의해 타입을 전달받아 전달받은 타입으로 타입을 결정하므로 IoC에 부합한다고 생각합니다.또한 외부에서 타입을 주입받으므로 의존성 주입에도 부합하다고 생각합니다.혹시 제 생각이 틀렸나요?
-
미해결김영한의 실전 자바 - 기본편
클래스 상수 선언
안녕하세요. 만약 flag 값이 1이면 데이터를 빨간색으로 표기한다 라고 가정했을때 private static final String RED = "1"; if(param.getFlag().equals(RED)){.... 빨간색 표기 로직}저는 이런식으로 상수를 선언해추후 소스를 봤을때 "1" 이라는 코드가 뭘 나타내는지 이해하기 쉽게 개발을 진행하고 있습니다. 근데 static 변수와 같은경우 메모리에 계속 떠있다보니클래스에서 이런식으로 static 변수를 계속 선언하는것이 메모리 부족에 영향을 끼치지는 않을지? 걱정이 들기 시작했습니다. 톰캣 서버의 jvm 메모리가 1gb 라고 가정했을때메모리 걱정을 하지않고 static 변수를 선언해도 괜찮을까요? 아니면 이런 경우 그냥 static 키워드를 제거하고 private final String RED = "1"; 이렇게 사용해서 gc 의 대상이 되도록 하는게 바람직할까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
실행 오류 도와주세요.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 삼각형 눌러서 실행시키면 다음과 같은 에러가 뜹니다. 구글링 참고해서 세팅 바꿔보았는데도 해결이 안돼요 도와주세요 ㅠㅠ Error: LinkageError occurred while loading main class Hellooo java.lang.UnsupportedClassVersionError: Preview features are not enabled for Hellooo (class file version 66.65535). Try running with '--enable-preview'
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
강의 10분 20초 부분에 대해 질문 있습니다.
운영제체 관점에서 보면 다음과 같이 구분할 수 있다.워드 프로그램 - 프로세스A스레드1: 문서 편집스레드2: 자동 저장스레드3: 맞춤법 검사유튜브 프로세스B스레드1: 영상 재생스레드2: 댓글강의 내용중에 위와 같은 내용이 있습니다.유튜브라는 프로세스가 실행이 되고 영상 재생을 담당하는 스레드1이 생기고 댓글을 담당하는 스레드2가 생긴다고 했을때 영상 재생은 계속해서 사용자한테 보여줘야 하므로 스레드1이 쭉 영상 재생을 담당할거 같은데 댓글 같은 경우는 스레드2가 어떻게 동작하는지 궁금합니다. 댓글을 작성할때마다 스레드2가 생성되서 해당 댓글을 담당 한다는 건지 아니면 딱 하나의 스레드2가 생성이 되고 이 스레드2가 여러 사용자들의 댓글 작성 요청에 대해 관리를 하는건지 궁금합니다.