묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
H2 testcase 연결 실패
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트를 위해서 윈도우에서 배치파일로 실행하면주소에 key값이 안 나오고 바로 jsessionid가 나와서key값 앞에 localhost로 변경해서 접속을 할 수가 없는데어떻게 연결하나요?그냥 jdbc:h2:~/testcase로 연결하려고 해도Database "C:/Users/user/testcase" not found, either pre-create it or allow remote database creation여전히 이 오류가 나서 testcase로 접속할 수가 없습니다
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
프론트 코드 부탁드립니다.
안녕하세요 강사님. 좋은 강의 잘 들었습니다.배포 끝내고 간단한 기능들 추가 해보고 싶은데 프론트엔드 원본 코드 아래 메일로 보내주시면 감사하겠습니다.그럼 즐거운 하루 보내세요😊bellbu@naver.com
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
DBeaver 연결부터 도커로프로젝트 빌드까지 안됩니다.
https://github.com/WooXher/kotlin-study-portfolio 백엔드 프로젝트 참여중인 인원입니다 오후부터 강의 들으면서 따라하고 있는데 첫 mysql 연결시는 3306포트가 사용중이라고 하여 3307로 변경하고 실행하였는데 테스크 커넥션에서 비밀번호가 거부되어 연결이 안되어서 넘기고 프로젝트 빌드이후로 시작하고 있는데 디비연결이 안되어서 그런지 데이터가 보이지 않았습니다. 이것저것 수정하다보니 이젠 프로젝트 자체도 연결이 안되고 있는데 어떻게 해야하나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
외부 라이브러리를 사용하는 코드의 테스트 코드에 대해 질문이 있습니다.
강의를 보고 기존 프로젝트에 작성하지 않았던 테스트 코드를 작성하면서 공부하고 있습니다.도메인 모듈같은 경우 어떠한 의존성도 가지고 있지 않은 POJO 형태로 코드를 작성해서 단위 테스트로 검증할 수 있었습니다.Crawling 모듈의 경우 Jsoup이라는 라이브러리를 사용하여 특정 URL의 HTML을 불러오고, 해당 HTML에서 필요한 정보를 추출하는 코드를 가지고 있습니다.이때, 전체적으로 Mock을 사용하여 테스트를 진행하고자 하였는데 라이브러리의 특성 때문에 stubbing을 작성하는데 불편함을 느꼈습니다.그래서 HTML을 임의로 만들고, HTML을 불러오는 메서드만 stubbing을 적용하려고 하는게 더 효율적이지 않을까 라는 생각이 들었습니다.외부 라이브러리를 사용하는 코드에서 테스트 작성이 미숙한 것 같아서 어떤 방향이 더 좋을지 질문드리고 싶습니다. 아래 두 코드는 동일한 테스트를 진행하고 있는 코드가 아닌점 참고바랍니다.@Mock private lateinit var webPageLoader: WebPageLoader<Document> @InjectMocks private lateinit var dietParser: DietParser fun parse() { // given val mockDocument = mock(Document::class.java) val mockRows = Elements() val row1 = mock(Element::class.java) val row2 = mock(Element::class.java) val row3 = mock(Element::class.java) mockRows.add(row1) mockRows.add(row2) mockRows.add(row3) val columns1 = Elements( mock(Element::class.java).apply { given(text()).willReturn("2024.10.23") }, mock(Element::class.java), mock(Element::class.java), mock(Element::class.java).apply { given(text()).willReturn("Menu 1, Menu 2") } ) val columns2 = Elements( mock(Element::class.java).apply { given(text()).willReturn("교직원식당") } ) val columns3 = Elements( mock(Element::class.java).apply { given(text()).willReturn("2024.10.24") }, mock(Element::class.java), mock(Element::class.java), mock(Element::class.java).apply { given(text()).willReturn("Menu 3, Menu 4") } ) given(webPageLoader.getHTML(anyString())).willReturn(mockDocument) given(mockDocument.select(anyString())).willReturn(mockRows) given(row1.select(anyString())).willReturn(columns1) given(row2.select(anyString())).willReturn(columns2) given(row3.select(anyString())).willReturn(columns3) // when val result = dietParser.parse() // then assertThat(result).hasSize(2) .extracting("date", "menus") .containsExactly( tuple(LocalDate.of(2024, 10, 23), listOf("Menu 1", "Menu 2")), tuple(LocalDate.of(2024, 10, 24), listOf("Menu 3", "Menu 4")), ) } @Mock private lateinit var webPageLoader: WebPageLoader<Document> @InjectMocks private lateinit var parser: DepartmentNoticeParser fun parse() { // given val html = """ <table class="board-table"> <tbody> <tr> <td class="td-num">2</td> <td class="td-subject"><a href="javascript:fnView('2','url','title','2')">공지 제목 2</a></td> <td class="td-write">작성자 2</td> <td class="td-date">2024.10.02</td> </tr> <tr> <td class="td-num">1</td> <td class="td-subject"><a href="javascript:fnView('1','url','title','1')">공지 제목 1</a></td> <td class="td-write">작성자 1</td> <td class="td-date">2024.10.01</td> </tr> </tbody> </table> """.trimIndent() val document: Document = Jsoup.parse(html) given(webPageLoader.getHTML(anyString())).willReturn(document) parser.initialize(Major.COMPUTER_SOFTWARE_ENGINEERING) // when val notices = parser.parse() // then assertThat(notices).hasSize(2) .extracting("number", "title", "author", "date", "url") .containsExactlyInAnyOrder( tuple( 2, "공지 제목 2", "작성자 2", LocalDate.of(2024, 10, 2), "https://www.dongyang.ac.kr/combBbs/2/url/2/view.do?layout=unknown" ), tuple( 1, "공지 제목 1", "작성자 1", LocalDate.of(2024, 10, 1), "https://www.dongyang.ac.kr/combBbs/1/url/1/view.do?layout=unknown" ), ) }
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 given절 작성 시, "팩토리 메서드를 통한 생성 지양" 관련 문의
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 강의에서 테스트 given절에서 팩토리 메서드를 통한 객체 생성은 어떠한 의도가 들어갈 수 있으므로 지양하라고 하셨습니다. 관련하여 질문이 있습니다. 예를 들어 다음과 같은 팩토리 메서드가 있다고 하면,public class Coffee { private String type; private int size; public Coffee(String type, int size) { this.type = type; this.size = size; } }public class SeasonalCoffeeFactory { public static Coffee createCoffee(String season) { switch (season.toLowerCase()) { case "summer": return new Coffee("Iced Coffee", 50); case "winter": return new Coffee("Hot Coffee", 30); case "spring": return new Coffee("Latte", 40); case "fall": return new Coffee("Pumpkin Spice Latte", 45); default: throw new IllegalArgumentException("Unknown season: " + season); } }}여름 시즌 커피에 대한 테스트 코드는 다음과 같을 겁니다. @Test public void testCreateSummerCoffee() { Coffee coffee = SeasonalCoffeeFactory.createCoffee("summer"); assertEquals("Iced Coffee", coffee.getType()); assertEquals(50, coffee.getSize()); } 이때 테스트 코드는 시즌에 맞는 커피 메뉴를 given절에 생성한 후 타입 일치여부만 판단하면 됩니다.하지만 이 부분을 팩토리 메서드로 작성하지 않게되면커피를 생성함에 있어if ("summer".equalsIgnoreCase(season)) { coffee = new Coffee("Iced Coffee", 50); } else if... 와 같은 부분이 테스트 코드의 given절에 들어가야하지 않나 싶습니다. 물론 이런 부분에 대해서 if라는 논리구조가 들어갔으니 한번 더 테스트 코드 메서드가 분리되어야하는건가 싶기도 한데 확신이 잘 안 서서 질문 드리고 싶습니다.긴 글 읽어주셔서 감사합니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
뷰 개발 파일 없음
다운받은 파일에서assets/vendor/quill/quill.min.js.quill.min.js가 존재하지않는데 그냥 진행해도 될까요? fragment-foot<script src="assets/vendor/quill/quill.min.js" th:src="@{/assets/vendor/quill/quill.min.js}"></script>페이지 실행은 잘 되는데 파일이 존재하지않아서 에러가 나옵니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
fragment 분리 에러
타임리프 뭐가 문제일까요? 아무리 찾아봐도 모르겠습니다ㅜ https://github.com/lee-soohyun/portfolio-lee/commit/56f4909c2ceb6c6e5ad1b6dbb9603e0c2233a825
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
writer 와 content 혼란
api 서버에서 Todo 엔티티 에는 content 로 했는데 왜 이번 섹션4 강의부터 갑자기 writer 가 나오는 건가요?원래 writer 인데 content로 잘못 만드신건데 그냥 사용하신건가요? 그냥 계속 진행 해도 별 문제 없는 건지 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
추스 스키마 질문...
스프링강의 18강 Controller를 3단 분리하기 강의에서 7분 30초쯤에 나오는 추스 스키마? 아무리 찾아도 저는 그런게 없는데 어떻게 하나요? 추스 스키마로 라이브러리 설정이 저는 보이지 않네요 인텔리제이 2024.2.3 울티메이트 사용하고 있습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
6분 41초 영상 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해당 영상 6분 41초에서 '사실상 Member에서 Orders의 1대 다가 표현되는 이 컬렉션은 필요가 없다' 라고 말씀해주셨는데 해당 표현에 의미가 1:N 연관 관계가 필요없다는 의미가 아니라 orders속성이 필요없다는 의미가 맞을까요??
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
admin 페이지에서 projectSkill 질문 있습니다
admin 페이지 중 왼쪽에 사이드바에서 projectSkill 클릭할 때 url 이 "/admin/project/skill" 이 아닌, "admin/projectSkill" 로 넘어가져서 오류 페이지로 이동된다면 어디를 고쳐야 할까요? @Controller @RequestMapping("/admin/project/skill") class AdminProjectSkillViewController( private val adminProjectSkillService: AdminProjectSkillService ) { @GetMapping fun projectSkill(model: Model): String { val proejctList = adminProjectSkillService.getProjectList() val skillList = adminProjectSkillService.getSkillList() val formElements = listOf<FormElementDTO>( SelectFormElementDTO("project", 8, proejctList), SelectFormElementDTO("skill", 4, skillList) ) model.addAttribute("formElements", formElements) val table = adminProjectSkillService.getProjectSkillTable() model.addAttribute("table", table) model.addAttribute("detailTable", null) val pageAttributes = mutableMapOf<String, Any>( Pair("menuName", "Projects"), Pair("pageName", table.name), Pair("editable", false), Pair("deletable", true), Pair("hasDetails", false), ) model.addAllAttributes(pageAttributes) return "admin/page-table" } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블이 생성이 안됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)y2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)y3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)y[질문 내용]여기에 질문 내용을 남겨주세요.H2를 삭제 후 재설치도 해봤지만 여전히 테이블이 생기지않습니다...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v5, v6 로 가면서 점점 JPA 를 쓰는 장점이 없어지는 느낌이 들어서요..
JPQL 로 한번에 가져오는 방식으로 변경해가면서 실제 db 로 날아가는 쿼리 횟수는 적어지지만 jpql 에 점점 더 많이 의존하게 되는것 같아요. 전 jpa 가 sql 쿼리 사용의 의존을 줄이고 애플리케이션 단에서 객체지향 적으로 코드를 짤 수 있다는 이유 때문에 사용하는 것으로 알고있는데요.. 물론 orm 만으로 모든 비즈니스 로직을 해결하기엔 힘든 경우도 있다는 것은 잘 이해하고 있지만, JPQL 을 많이 사용할 수록 mybatis 를 사용하는 것과 다를게 없다는 느낌이 드는데.. 현업에서는 n + 1 문제나 쿼리 횟수 최적화를 위해서 jpql 로 많이 작성하는지 궁금해요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
refresh token filter
refresh token filter를 validation하고재발급해주는 걸 컨트롤러로 구현하셨는데 필터로 구현한다면UsernamePasswordAuthenticationFilter 앞으로 지정한JWTCheckFilter 에다가 구현하면될까요>?
-
미해결Practical Testing: 실용적인 테스트 가이드
TDD 를 적용하면 구현하려는 기능에 필요한 객체들을 설계하고 들어가야 하는건가요?
안녕하세요 강사님. 요즘 질문을 많이해서 대단히 죄송하게 생각하고 있습니다! 우선 질문 계기를 들어보시죠. [질문을 하게 된 이유]처음에 최소한으로 돌아가는 쓰레기 코드를 만들었고, 리팩토링으로 객체를 쪼개며 단위 테스트를 작성하고 있었습니다. 근데 갑자기 이런 고민이 들더군요. "TDD 를 적용하려면 어떻게 해야하지?" 하지만 아무리 생각을 해봐도 TDD 를 적용하려면 "쓰레기를 만들고, 여러 객체들로 쪼개 개선해나가는" 형태의 개발방식에은 사용할 수 없다는 결론에 도달하게 되었습니다. 애초에 TDD 를 적용하려면 "처음부터 구현하려는 기능에 필요한 객체들을 생각하고 만들어나가야 하는건가?" 아니 이러면 너무 피곤하지 않나? 라는 생각이 들었습니다. [본격적인 질문][질문 1]처음부터 돌아가는 쓰레기 코드(하나의 클래스에 몰빵) 를 만들고, 리팩토링을 통해 여러 객체로 책임을 분산시키는 형태의 개발 방식은 애초에 TDD 를 적용할 수 없는 것인가요? (TDD 를 적용하면 애초에 스파게티 코드가 나올 수 없는건가요?) [질문 2]TDD 가 애초에 구현하려는 기능에 필요한 객체들을 처음부터 설계하고 들어가는 방식인건가요? [질문 3]TDD 를 적용하려면 구현하는 기능에 필요한 도메인 지식들을 완벽하게 숙지하고 들어가야 코드를 수정하는 일이 별로 없을거라고 생각됩니다. 그렇지 않으면 "일단 쓰레기 구현 -> 리팩토링 -> 테스트" 개발 방식보다 시간이 훨씬 오래 걸릴거라고 생각하는데.. 강사님 생각은 어떠신지 궁금합니다. [질문 4]TDD 를 적용하면 코드 품질이 좋을 수 밖에 없는 이유가 [질문 2] 때문인가요? (한국말 너무 어렵습니다..)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문상품 양방향
주문상품과 주문은 다대일 양방향인데주문상품과 상품은 다대일 단방향으로 하셨는데첫번째는 양방향으로 설정하신 이유가 뭘까요?
-
미해결실전! 스프링 데이터 JPA
em.persist에 대해서 궁금한 점이 있습니다.
제 기억속에 jpa 활용편에서 들었던 내용이였던 거 같은데em.persist()를 호출하게 되면 id값이 자동증가여서값이 null이기 때문에 em.flush를 호출안해줘도 persist와 동시에 flush가 호출된다고 기억속에 있습니다...혹시 맞을까요..?
-
미해결Practical Testing: 실용적인 테스트 가이드
contextLoads() 테스트는 왜 깨진 것인가요?
강의 중에 별도의 언급 없이 지우고 넘어가셔서 질문합니다.contextLoads() 테스트는 왜 깨진 것인가요?이 테스트는 지워도 되는 것인가요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
JWT 체크필터만들기 보고있습니다
api 가 요청받을때 시큐리티 필터 넘버링되서 13개쭉나오는 설정은 어디서 하는건지 알수있을까요>?
-
미해결실전! 스프링 데이터 JPA
더티체킹에 궁금한 점이 있습니다.
public void updateUserName(Long userId, String newName) { User user = userRepository.findById(userId) .orElseThrow(() -> new CustomException("User not found with id: " + userId)); user.setName(newName); userRepository.save(user); } 여기서 findById로 인해 영속성 컨텍스트에 user가 올라가있어서 setName만 해줘도 더티체킹으로 인해서 저장되는 걸로 알고있습니다.그러면 userRepository.save(user);를 따로 해줘야하나요?