묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 중급 1편
정적 중첩 클래스 질문
[질문 내용]여기에 질문 내용을 남겨주세요. static 멤버들은 원래 인스턴스 멤버들을 사용못하는데, static클래스도 내부에서 외부의 인스턴스 멤버들을 호출 못하는데, 인스턴스 변수는 왜 생성할 수 있나요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
part3 강의 개강
제 기억에는 작년 말에는 part3강의가 나온다고 하셨는데,언제 쯤 강의 오픈 예정이신가요?
-
미해결토비의 스프링 6 - 이해와 원리
생성자 파라미터성자 파라미터
안녕하세요 수강중에 놓친 내용이 있는 것 같아서 질문 드립니다@Configuration public class DataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .build(); } @Bean public PlatformTransactionManager transactionManager(DataSource emf) { return new DataSourceTransactionManager(emf); } }componentScan 패키지 영역 내에서는Bean Context에 등록된 Bean 객체면Parameter로 전달받아서 사용할 수 있는건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle 빌드 오류
Execution failed for task ':test'.라고만 계속뜨네요인텔리제이도 다시 설치해봤는데...혹시 이메일을 알려주신다면 제가 project 파일을 보내드려도될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional을 붙여도 Rollback이 되지 않는 문제는 해결했으나 이유륾 모름
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]해결했습니다.복붙하는 과정에서private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); }이 부분이 있는 걸 몰랐네요 저는 conn = dataSource.getConnection() 으로 진행해서 문제가 생긴거였습니다 그런데 추가적인 질문으로 이렇게 했을 때는 롤백이 되지 않는 이유가 무엇인가요? 강의 코드와 똑같이 수정했음에도 롤백되지 않고 계속 DB에 반영이 됩니다. 참고로 다른 질문글의 conn 관련된 수정도 이미 했음에도 롤백되지 않습니다. 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 { // DB와 연동하려면 Datasource가 필요함 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 = dataSource.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 = dataSource.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 = dataSource.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 = dataSource.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 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); } } SpringConfigpackage hello.hello_spring; import hello.hello_spring.Repository.JdbcMemberRepository; import hello.hello_spring.Repository.MemberRepository; import hello.hello_spring.Repository.MemoryMemberRepository; import hello.hello_spring.Service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class SpringConfig { private DataSource dataSource; @Autowired public SpringConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new JdbcMemberRepository(dataSource); } } MemberServiceIntegrationTestpackage hello.hello_spring.Service; import hello.hello_spring.Domain.Member; import hello.hello_spring.Repository.MemberRepository; import hello.hello_spring.Repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; // 테스트는 반복해서 시도할 수 있어야 하기 때문에 DB에 데이터를 인서트 쿼리하고 '롤백' 해주는 것 (정확히는 DB에 반영을 안하는 것) // 이를 위해서 @Transactional 사용 @SpringBootTest @Transactional class MemberServiceIntegrationTest { // 테스트는 특수한 용도이기 때문에 일회성(?)으로 필드 주입을 해도 무관 @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() { // given Member member = new Member(); member.setName("spring"); // when Long saveId = memberService.join(member); // then Member one = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(one.getName()); } @Test public void 중복_회원_예외() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> memberService.join(member2)); assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // try { // memberService.join(member2); // } catch (IllegalArgumentException e) { // assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // } // then } }
-
미해결백엔드 개발을 위한 필수 강의 - 스프링 부트3
3-9에서 오류 발생
게시물을 확인하려고 하면 아래와 같은 오류가 발생합니다. question_detail.html에서 코드를 잘못작성했을까봐 깃허브에서 코드 복붙해서 실행해도 똑같이 오류가 발생합니다..
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
성능 최적화에서 쿼리 횟수 줄이는 것이 가장 중요한 것인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용에서 계속해서 쿼리 횟수를 줄이는 방향으로 확장시키시는데 일반적으로 db에 sql문 날리는 횟수를 줄이는 것이 가장 중요한 것이 맞을까요? 극적으로, db에 간단한 sql문 2번 날리기 vs 조인 많은 sql문 1번 날리기 하면 후자가 더 성능이 좋은지 여쭙니다.물론 상황에 따라 다르겠지만 일반적인 상황을 가정하여 답해주시면 감사할 것 같습니다. 일반적으로 db 네트워크 비용때문에 후자가 더 좋은게 맞을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
리눅스 서버에 대한 질문입니다.
스프링부트를 배포하는것을 검색하다보면 apache2.4를 서버에 설치 하는 것을 많이 본 거 같은데, 지금 도서관리 서비스는 정적인 서비스라 아파치가 필요 없는 걸까요?? 아니면 사용할 필요가 없는거 일까요?? 궁금합니다..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
하나의 바운디드 컨텍스트 안에서는 연관관계 맵핑을 사용하는 게 좋을까요?
안녕하세요, 선생님 좋은 강의 늘 감사합니다. 자바 강의도 고급 3편 나올 날만을 기다리고 있습니다^^(자바는 개인계정이 아니라 비즈니스 계정으로 듣고 있습니다)제가 이때까지 강의에서 배운 대로 실무에서 연관관계 맵핑을 사용하다가 MSA 프로젝트를 조금씩 하게 되었는데, 바운디드 컨텍스트 간에는 도메인끼리 전역 식별자(Long, String, ...) 을 사용하고 있습니다. 근데 한 바운디드 컨텍스트, 한 마이크로서비스 안에서는 서로 연관관계 맵핑을 하는 게 좋을까 문득 의문이 들었습니다. 서로 연관성이 높긴 하지만 결과적으로 다른 객체를 참고함에 있어서 어떤 건 키값으로, 어떤 건 엔티티 타입으로 참조하니까 동료들이 헷갈리진 않을까?(연관관계 맵핑한 경우)이후에 어떤 필요에 의해서 한 마이크로서비스 안에 있던 테이블들을 여러 개의 서비스로 나누게 된다면, 전역 식별자로 바꾸어야 하니 유지보수를 어렵게 하는 건 아닐까? 이런 고민들이 있는데 인터넷, AI 등으로는 뭔가 납득이 가는 답변을 못 만난 것 같아 고민고민하다가 결국 여기에 조심스레 여쭙고자 합니다. 하나의 바운디드 컨텍스트 안에서 연관관계 맵핑을 사용 ->하지 않고 모두 전역식별자를 사용하는 게 좋다.팀의 방향성 등에 따라 달라질 수 있는 부분이고, 어느 쪽을 하든 상관 없다. 저는 이 두 고민 사이에서 아직 명확한 답을 내리진 못 했는데, 선생님께서는 혹시 어떻게 생각하실까요?약간 강의 범위를 벗어난 것 같기도 해서 죄송합니다ㅠㅠ 짧게나마 도움 주시면 정말 감사하겠습니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
리턴값 질문드립니다.
몇번째 강의에서 들었는지 기억이 안나는데갑자기 궁금해서 문의드립니다. void 는 리턴값이 없다 라고 알고 있고return0은 괄호안 실행문이 종료되는 기능으로 알고 있는데 가끔 return1 도 보이더라구요요건 어떻게 처리가 되는지 설명 부탁드려요...ㅠㅠ호출한 곳으로 1이란 값을 돌려주는 건가요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
event, study 참조
강의 잘 듣고 있습니다! 현재 Event에서 다대일로 study를 단방향으로 참조하고있는데 스터디 모집시에 event쪽이 삭제되지 않아 버그가 생깁니다. 해결법으로는 2가지 생각해봤는데요.양방향관계로 변경 후 Cascade사용단방향으로 유지하지만 스터디종료 메서드에서 event를 수동으로 remove처리1번 방법으로는 엔티티 설계 구조가 깨지니까 2번방법이 나으려나요. 고민이됩니다. 이런 참조 문제가 더 생길것을 방지해 양방향 관계로가는게 더 유연할지가 고민입니다. 아니면 초기설계목표상 모임이 하나라도 존재하면 스터디가 삭제되면안되는것인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 테스트 Rollback(false) 설정 했는데 h2 db에 데이터 없음.
=====================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]회원가입 테스트 시 Rollback(false)를 설정하고 실행은 정상적으로 되고 log에서도 insert 된 것을 확인할 수 있는데, h2 db 에서는 데이터가 들어와있지 않습니다. 왜 그런걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
assertj 에 해당하는 Assertions 이 import가 상단에 되지 않는이
[질문 내용]ctrl + enter 를 해도 import가 상단에 안되는데 어떻게 해결을 해야할까요? junit 의 Assertions 만 import가 잘됩니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 부분에서 오류가 납니다.
빌드 부분에서 오류가 납니다.JAVA버젼도 21버젼으로 다시설치했고 경로에 한글도 없는데 왜일까요?답변 부탁드립니다.
-
미해결김영한의 실전 자바 - 중급 2편
anotherCard.suit이 가능한 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]public int compareTo(Card anotherCard) { // 숫자를 먼저 비교하고, 숫자가 같으면 마크를 비교 if (this.rank != anotherCard.rank) { return Integer.compare(this.rank, anotherCard.rank); } else { return this.suit.compareTo(anotherCard.suit); } }이 코드에서 priavte으로 선언된 rank와 suit에 anotherCard.getRank() 나 anotherCard.getSuit() 으로 접근하지 않고 anotehrCard.rank 와 anotherCard.suit 로 바로 접근할 수 있는 이유가 뭔가요??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
localhost:8080 접속시 로그인
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 localhost:8080 입력했는데로그인 하라고 떠서요.. 혹시 뭐가 잘못된걸까요....?오늘 인텔리제이는 처음 설치해서 사용중이고원래는 sts3을 사용했었습니다..!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 오픈 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.build.gradle 오픈하니까 이런 에러가 뜹니다.
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
변수 숫자 표현 범위_long, double
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용][김영한의 자바 입문] 강의 중 [형변환 1-자동형변환] 수강 중 질문이 있습니다. 1:25에 숫자 표현 범위가 long보다는 double이 크다고 하셨습니다.하지만 이전 변수 타입 강의 때, long과 double 모두 2의 64승 만큼의 메모리 크기를 가진다고 배웠습니다. 메모리 크기가 같은데 왜 long보다 double의 숫자 표현 범위가 더 큰지 궁금합니다. double이 실수형이라 소수점까지 표현이 가능하기 때문인가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
단일 쓰레드에서 성능 차이가 발생하는 이유
성능 테스트를 할 때 멀티쓰레드를 사용하는 것이 아닌 단일 쓰레드(main 쓰레드)만 사용하고 있는데, increment()에 synchronized를 붙인 것과 안 붙인 것의 성능 차이는 왜 발생하는 것인가요? BasicInteger와 VolatileInteger의 경우에는 캐시를 사용하는가, 메인 메모리를 사용하는가의 차이로 성능 문제가 발생했다는 것은 알겠는데, BasicInteger와 SyncInteger 간의 성능 차이가 왜 발생하는 것인지 모르겠습니다..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일 대 일 관계
[질문 내용]회원 테이블과 주민등록번호 테이블이 있다 가정했을 때 주민등록번호는 회원의 고유번호이고, 유니크 정보이기 때문에 회원과 주민등록번호 는 서로 일대일 관계가 되겠네요? 그렇다면 이 두 테이블에 대한 엔티티도 만들었을 때 서로 외래키를 선택할 수도 있는거고요.