묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 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에서 코드를 잘못작성했을까봐 깃허브에서 코드 복붙해서 실행해도 똑같이 오류가 발생합니다..
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
강의 관련 질문드립니다.
24년 12월에 결제하여 수강 중입니다올해 [코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스 강의가 오픈 된 것을 보았는데, 강의 간 내용에 많은 차이 점이 있을까요? 신규 강의를 수강하려면 재결제 하는 방법밖에 없을까요..?
-
미해결
dd
dd
-
미해결카프카 완벽 가이드 - 커넥트(Connect) 편
binlog와 offset 관련 추가 질문드립니다
안녕하세요~ 강의를 듣다가 binlog관련 궁금한 점이 생겨서 질문드립니다!해당 커넥트의 offset정보에 담긴 binlog파일이 만약 삭제됐다면 기동 중에 오류가 발생한다고 말씀을 주셨는데, 그럼 만약 binlog 파일이 커져서 다음 파일?로 넘어가서 새로운 binlog파일로 생성이 된다면 오류는 발생하지 않고 offset에는 다음 binlog파일로 기록이 되는 것일까요?
-
해결됨실전 연습으로 익히는 고급 타입스크립트 기술
제네릭과 사용자 정의 타입 가드에 관한 질문
안녕하세요 타입스크립트 강의 잘 듣고 있습니다. 좋은 강의 감사합니다. 하지만 아직 제 머리로는 이해가 되지 않는 부분이 있어 질문을 드리는데요. 여기 제가 구현하고자 하는DatePicker라는 클래스가 있고 이 클래스를 하나의 날짜를 선택하는 'single'타입의 DatePicker와 기간을 선택하는 'range' 타입의 DatePicker로 사용 가능하도록 만드려고 합니다.type SingleValue = Date | null type RangeValue = SingleValue[] & { length: 2 } type DatePickerValue<T extends 'single' | 'range'> = { 'single': SingleValue, 'range': RangeValue }[T] class DatePicker<T extends 'single' | 'range'> { type:T value: DatePickerValue<T> constructor(type:T, initialValue:DatePickerValue<T>) { this.type = type this.value = initialValue } updateValue(date:Date) { // update value... } } const singeDatePicker = new DatePicker('single', new Date('2025-01-01')) singeDatePicker.value = new Date('2025-01-15') // (property) DatePicker<"single">.value: SingleValue const rangeDatePicker = new DatePicker('range', [new Date('2025-01-01'), new Date('2025-01-05')]) rangeDatePicker.value = [new Date('2025-01-03'), new Date('2025-01-10')] // (property) DatePicker<"range">.value: RangeValue이렇게 DatePicker클래스의 type property의 제네릭을 통해 value의 타입도 잘 추론이 되는데요. 문제는 클래스 내부에서 타입을 좁히고 싶은데 잘 되지 않습니다. 아래처럼 updateValue 메소드를 DatePicker클래스에 추가하여 외부 달력 클릭시 날짜 객체를 인자로 넘겨 클래스의 value를 업데이트 해주기 위한 로직을 구현하려고 하는데, 클래스 내부에서는 사용자 정의 타입 가드를 사용해도 value 의 타입이 좁혀지지가 않습니다. updateValue(date:Date) { const isSingle = ():this is DatePicker<'single'> => this.type === 'single' const isRange = ():this is DatePicker<'range'> => this.type === 'range' if(isSingle()) { this.value = date // Type 'Date' is not assignable to type 'DatePickerValue<T>'. // Type 'Date' is not assignable to type 'Date & SingleValue[] & { length: 2; }'. // Type 'Date' is missing the following properties from type 'SingleValue[]': length, pop, push, concat, and 26 more.(2322) // (property) DatePicker<T extends "single" | "range">.value: DatePickerValue<T> return; } if(isRange()) { this.value = [date, null] // Type '[Date, null]' is not assignable to type 'DatePickerValue<T>'. // Type '[Date, null]' is not assignable to type 'Date & SingleValue[] & { length: 2; }'. // Type '[Date, null]' is not assignable to type 'Date'.(2322) // (property) DatePicker<T extends "single" | "range">.value: DatePickerValue<T> return; } }제가 궁금한 것은 이렇게 클래스 내부에서 value: DatePickerValue<T>와 같은 조건부 타입을 사용자 정의 타입 가드로 추론을 하는 것이 가능한지 알고 싶습니다. 만약 안된다면 이유에 대해 설명 해주시면 감사하겠습니다.아니면 제 구현 방식의 문제가 있다면 지적해 주시면 많은 도움이 될 것 같습니다.감사합니다.
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
강의 연장 관련 문의
올해 4학년 올라가는 대학생입니다. 제가 작년에 강의 결제하고 학교 다니느라 바빠 시험 공부를 미루다가 올해 시험을 준비하려 하는데 강의 수강 기간이 한달밖에 남지 않아 공부할 시간이 부족할 것 같은데 혹시 연장가능할까요 강사님 ㅠㅠ 메일 주소는 stnow7@gmail.com 입니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
yarn berry 사용하고 데이터베이스 설정 값 .env로 분리
"devDependencies": { "@nestjs/cli": "^10.4.9", "@nestjs/schematics": "^10.2.3", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/pg": "^8", "@types/supertest": "^6.0.0", "@yarnpkg/pnpify": "^4.1.3", "dotenv": "^16.4.7", "dotenv-cli": "^8.0.0", "jest": "^29.5.0", "source-map-support": "^0.5.21", "supertest": "^7.0.0", "ts-jest": "^29.1.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "~5.3", "webpack": "^5.97.1" },dotenv랑 dotenv-cli 설치하고"start:dev": "dotenv -e .env nest start --watch", "start:debug": "dotenv -e .env -- yarn dlx @nestjs/cli start --debug --watch",하면 정상적으로 동작합니다!
-
미해결공식 엠버서더가 알려주는 노션 엑기스
강의자료가 없는건가요?
안녕하세요?생활노션 강좌는 별도 강의자료가 제공되지 않나요?네~ 열심히 공부하겠습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스
동적페이지 로드밸런서 연결
AWS HTTPS 적용하는 부분에서과정대로 2번 따라했는데똑같이 해당 에러가 나서 https로 접속이 안 되네요 ㅜㅜ이유가 먼지 알 수 있을까요?!
-
미해결[2024년] 지친 엑셀 유저를 위한 Power BI 기본 강의 (기초~중급 입문)
power bi 맵 및 등치 지역도 시각적 개체는 조직에서 사용할 수 없습니다
보고서를 온라인 상으로 게시하니 이러한 메세지가 나오면서 맵챠트가 안 나옵니다."power bi 맵 및 등치 지역도 시각적 개체는 조직에서 사용할 수 없습니다이 문제를 해결하려면 관리자에게 관리 포털에서 맵과 등치 지역도 시각적 개체를 사용하도록 요청합니다" 어떻게 해야 되나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Transactional 질문 있씁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 재직중인 직장 소스를 보면 트랜잭션을 걸어야하는 서비스단 메서드에 @Transactional의 격리 수준이 READ UNCOMMITTED 로 모두 되어있습니다. 하나도 빠짐없이.. 상사분의 말로는 테이블 락 발생을 방지하기 위해 이렇게 한다는데... 영한님의 의견이 궁금합니다. 제가 생각했을때 이는 적합하지 않은 방법같거든요. 정합성이 깨질뿐더러 테이블 락은 다른 방법으로 해결해야지 이건 아닌것 같더라구요.. 답변 기다리겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
성능 최적화에서 쿼리 횟수 줄이는 것이 가장 중요한 것인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용에서 계속해서 쿼리 횟수를 줄이는 방향으로 확장시키시는데 일반적으로 db에 sql문 날리는 횟수를 줄이는 것이 가장 중요한 것이 맞을까요? 극적으로, db에 간단한 sql문 2번 날리기 vs 조인 많은 sql문 1번 날리기 하면 후자가 더 성능이 좋은지 여쭙니다.물론 상황에 따라 다르겠지만 일반적인 상황을 가정하여 답해주시면 감사할 것 같습니다. 일반적으로 db 네트워크 비용때문에 후자가 더 좋은게 맞을까요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
ThreadSafe하지 않을때 해경 방법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요안녕하세요 앨런님 수업을 듣다가 궁금한 점이 생겨서 질문 드립니다! Thread Safe하지 않을 때의 해결 방법이 다시 시리얼큐로 보내는 방법이라고 하셨는데 이때 Task 전체를 다 큐로 보내는 건가요?? 아니면 힙 메모리에 동시에 접근하는 그 일부의 작업만 보내는 건가요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
try-with-resources 구문 사용 관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]해당 강의에서는 save(Member member)를 작성하면서 try-catch구문을 썼는데 아래처럼 try-with-resources구문을 사용하면 생길 수 있는 문제가 있어서 try-catch구문을 쓰는건가요?try (Connection con = getConnection(); PreparedStatement pstmt = con.prepareStatement(sql)) { pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney()); pstmt.executeUpdate(); return member; } catch (SQLException e) { log.error("db error", e); throw e; }제가 혼자 생각해봤었을 때의 이때의 생길 수 있는 문제점은 try(...)안의 자원들의 close()가 호출될 때가 아닌 생성될 때의 오류가 생기면 그걸 catch로 잡거나 그러지 못할수도 있다는 것이었습니다.실제로 h2데이터베이스를 끄고 실행해봤었을 때,Connection con = getConnection(); 부분에서 예외가 발생했고, catch로 잡지 못하는 모습이었습니다. 이처럼 자원 생성에서부터 예외가 발생할 때 try-with-resources를 사용하는 것은 적절치 않다고 생각하면 되는걸까요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
com()이 붙는이유
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 앨런님 ! 혹시 강의 준 문법 179강에서 아래와 같은 예시를 들어주셨는데요! func doSomething(com: @escaping(Void) -> Void) {DispathchQueue.global().async {print("프린트시작")sleep(3)print("프린트 종료")com()}}print("1")doSomething()print("2")해당 함수에서 꼭 com()컴플리션 핸들러가 들어가야 하나요? 아니면 해당 예시에서는 없어도 되는 걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12
C++ 언어 표준과 Engine.lib 오류에 관하여..
안녕하세요. DirectX12 강의를 이제 수강 시작한 학생입니다.강의에선 C++ 언어 표준을 C++ 14로 사용중입니다.전, C++ 20을 사용하여 아래와 같이 구조체 초기화를 사용하려 했습니다.DXGI_SWAP_CHAIN_DESC sd = { .BufferDesc = { .Width = static_cast<uint32>(info.width), .Height = static_cast<uint32>(info.height), .RefreshRate = { .Numerator = 60, .Denominator = 1 }, .Format = DXGI_FORMAT_R8G8B8A8_UNORM, .ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, .Scaling = DXGI_MODE_SCALING_UNSPECIFIED }, .SampleDesc = { .Count = 1, .Quality = 0 }, .BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT, .BufferCount = SWAP_CHAIN_BUFFER_COUNT, .OutputWindow = info.hwnd, .Windowed = info.windowed, .SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD, .Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH }; 하지만, C++ 20을 사용하면 Engine 프로젝트 빌드 시, byte << 모호하다는 오류가 나오며, Engine.lib 파일이 Output 폴더 내에서 사라집니다. 억지로 빌드 시킨 후, Client 프로젝트 실행 시 오류가 생깁니다.C++ 20기준 혹은 미리보기 최신 C++ 초안 기능을 사용하여 구조체 초기화 사용을 유지 한 채 실행할 수 있는 방법이 있을까요 ?
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
최신화 된 강의 요청합니다
안녕하세요, 이번에 강의를 구매한 학생입니다. 밑에 글에서 폼도 작성했습니다.강의를 진행하다 보니 강의가 출시된 지 시간이 꽤 지나 대부분의 구현 방식이 현재와 많이 달랐습니다. 특히 Firebase Cloud Messaging이나 CardStackView의 사용법이 강의 내용과 다릅니다. 이로 인해 별도로 혼자 많은 부분을 직접 새로 구현해야 했습니다. 앱은 구현했지만, 이 강좌 수강 목적인 FCM을 이용한 푸시 메시지 보내기가 실제 강의 내용과 많이 달랐습니다.해당 강의에 대한 아쉬움이 남는데 다른 질문글에서 강의를 최신화한다라는 답변을 봤습니다. 최신화 된 강의를 받거나 없으면 환불을 받고자 질문글 남겨요.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
리눅스 서버에 대한 질문입니다.
스프링부트를 배포하는것을 검색하다보면 apache2.4를 서버에 설치 하는 것을 많이 본 거 같은데, 지금 도서관리 서비스는 정적인 서비스라 아파치가 필요 없는 걸까요?? 아니면 사용할 필요가 없는거 일까요?? 궁금합니다..