안녕하세요 강사님. 강의 열심히 듣고 있는 학생입니다. 코딩테스트를 준비하면서 연습문제를 푸는데 말 그대로 구현이 너무 오래걸려서 고민입니다. 문제를 보면 어떻게 풀어야 할지, 시간복잡도는 어느정도가 될지 곧 잘 파악한다고 생각하는데 구현까지 너무 오래걸립니다... 기본적으로 3시간 이상 붙잡고 있는 것 같습니다... 코딩테스트가 경시대회 문제가 아니니 풀리지 않으면 답을 보고 넘어가라는 많은 분들의 조언을 들었고 저 역시도 그렇게 생각하나 키보드만 잡고 문제를 풀다가 보면 시간이 훌쩍 지나가 있어 매번 너무 고통스럽습니다.. 그렇다고 30분~1시간 내로 구현이 안되면 답을 보고 넘어가기엔 기본적인 로직조차 구현하지 못하고 답을 보게 되는지라 너무 답만보는 듯한 느낌이 들고, 그 이상이 넘어가면 어느새 삽질하고 있는 저를 발견하네요. 어떻게 하면 좋을까요.. 너무 답답해서 글 올립니다. 감사합니다.
안녕하세요 선생님의 강의 2주차를 수강하고 있는 학생입니다. 컴공 전공생이고, 현재 2학년 재학중에 있습니다. 개념 강의를 다 듣고 문제를 풀고 있습니다. 문제 해설강의 전에 먼저 고민해보고 문제를 풀려는데 문제가 너무 어려워 하나도 스스로 풀어보지 못하고 있습니다. 로직을 떠올리는 것과 구현하는 것은 물론, 문제 자체를 이해하기 힘들 때도 많습니다. 그런데 어떻게든 이번 주차는 이번 주 안에 끝내야겠다는 생각 때문에 마치 수학 공부할 때 주구장창 답지만 외우는 것처럼 다짜고짜 해설 강의만 듣고 블로그에 기록하고 있습니다. 이렇게 공부하고 있는 게 맞는 걸까요? 너무 지치고 자괴감만 듭니다...
안녕하세요! 강사님! 알고리즘을 계속 연습하는 학생입니다. 질문에 앞서 간단히 공부과정을 말씀드리면 작년 12월 쯤 부터 해서 현재까지 꾸준히 알고리즘 문제를 풀어보면서 공부하고 있습니다. 지금까지는 절대적인 알고리즘 문제 경험이 적어서, 절대적인 시간 투자와 많은 문제에 도전하는 방식으로 공부했고, 정말 아예 이해가 안가거나 특정 알고리즘 대회 혹은 코테 문제들은 직접 참여해서 개인적으로 정리해서 기록해놓고, 다시 복기해보는 과정을 하고 있습니다.(그럼에도 다시 풀면 여전히 못풀긴 하더라구요..) 간혹, 알고리즘 문제를 풀어낼 때 제가 전혀 생각하지 못한 방법으로 풀이가 되는 문제들이 있는데(ex, 시뮬레이션-비밀번호), 저는 도저히 그 풀이에 대한 접근이나 생각까지는 도달하지 못하는 것 같습니다. (저는 20만번 * 8번 방향 탐색으로 풀었습니다.) 어떻게하면 그런 풀이나 접근을 생각해 낼 수 있는지... 그 사고과정을 연습하는 방법이 따로 존재하는 것인지 궁금해서 글 남겨봅니다. 질문을 요약하면 다음과 같습니다. 생각지 못한 풀이과정을 도출할 수 있는 사고연습(생각하는 연습)이나 방법이 존재하는것인지? 1-1. 있다면 댓글을 통해 알려주실 수 있는지? 해당 알고리즘 강의를 저같은 사람이 어떻게 활용해 보는것이 좋을지? 긴 글 읽어주셔서 감사합니다.
안녕하세요 김영한 선생님! 선생님 강의 덕분에 스프링 공부 재밌게 하고 있습니다! 다름이아니라 코드 예제에서 테이블을 설계할 때 @GeneratedValue 어노테이션을 사용해서 모든 테이블의 PK를 idx로 잡고 비식별 관계로 연결하는 구조를 짜시던데 이 부분에 질문이 있습니다! 예를 들어 유저 테이블의 아이디 컬럼이 Not Null이고, Unique한 값이라고 할 때 이 컬럼이 유저 테이블의 PK역할을 할 수 있다고 생각하는데, idx 컬럼을 단순히 auto increment 타입으로 설정하게 되면 불필요한 컬럼이 늘어나는게 아닌지 궁금합니다! 테이블에서 Not Null이고, Unique한 컬럼이 있음에도 불구하고 auto increment를 활용한 id를 pk로 잡는것의 장점이 있을까요??
QueryDSL 내부 메소드 중 fetchResult() 나 fetchCount()는 만료된 메소드에 대해서는 QueryDSL에서 Blaze-persistence Integration 라이브러리 사용을 권장 하는데요, Blaze-persistence도 QueryDSL 처럼 쿼리 빌더 API 로서 개발자에게 유지보수하기 좋은 객체를 제공해주고 있습니다. 게다가 최신 업데이트 날짜가 글 작성일 기준(2023.06.21) 일주일 이전이라 여전히 유지보수되고 있어서 최신 스프링버전과 호환성도 어느정도 보장되었다고 볼 수 있습니다. 개인적으로 SpringBoot 3.1.0 기준으로 다음과 같이 세팅하니 정상적으로 동작하는 걸 확인했는데요, 혹시 저처럼 deprecated 메소드를 쓰는 것이 신경쓰이시는 분들을 위해 공유드립니다. build.gradle dependencies { //Blaze-Persistence implementation 'com.blazebit:blaze-persistence-integration-querydsl-expressions-jakarta:1.6.9' implementation 'com.blazebit:blaze-persistence-integration-hibernate-6.2:1.6.9' implementation 'com.blazebit:blaze-persistence-core-impl-jakarta:1.6.9' } BlazePersistenceConfiguration.java @Configuration public class BlazePersistenceConfiguration { @PersistenceUnit private EntityManagerFactory entityManagerFactory; @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Lazy(false) public CriteriaBuilderFactory createCriteriaBuilderFactory() { CriteriaBuilderConfiguration config = Criteria.getDefault(); // do some configuration return config.createCriteriaBuilderFactory(entityManagerFactory); } } QuerydslBasicTest.java ..... JPAQueryFactory queryFactory; @Autowired CriteriaBuilderFactory cbf; BlazeJPAQueryFactory blazeQueryFactory; @BeforeEach public void testEntity(){ queryFactory = new JPAQueryFactory(em); // 이건 동시성 문제를 고민하지 않아도 됨, 해결됨 blazeQueryFactory = new BlazeJPAQueryFactory(em, cbf); ..... 적용 결과 기존 QueryDSL 세팅한 것에 추가로 세팅하시면, 만료된 메소드에 대해 Blaze-persistence 객체로 대체되는데요, 기존 querydsl 클래스를 상속 받는 형태여서 QueryDSL이 제공하는 메소드를 그대로 쓸 수도 있습니다. fetchResults는 fetchPage로 바꿔서 사용할 것을 권장하고 있다는 점 참고하시면 될 것 같습니다. 추가로 내부로직이라든지 설명이 더 필요하시다면 Blaze-persistence 릴리즈 노트 와 Blaze Persistence Document 를 참고하시면 좋을 것 같습니다. 이 글에 대해 지적 및 피드백 해주시면 정말 감사하겠습니다. 감사합니다. 여담 및 고민 : 개인적으로 이 라이브러리의 내부로직을 뜯어보면서 분석하고 검증할 수 있는 역량은 부족한지라 분석 및 검증하는 방법에 대해서 팁이라든지, 아니면 blaze-persistence 사용할 시 주의해야할 점이라든지 조언해주실 수 있으시면 정말 감사드립니다. 강의를 듣던 중에 서브쿼리가 발생하는 부분에서는 정상동작하지 않는 것을 발견했습니다. @Test public void findUserDto(){ QMember memberSub = new QMember("memberSub"); List<UserDto> memberDtoList = queryFactory //이건 blazeQueryFactory가 정상 동작하지 않음 .select(Projections.fields(UserDto.class, //생성자 필드 순서에 맞게 변수를 만들어야 한다. member.username.as("name"), // member.age 대신 서브쿼리로 다 최대 나이로 찍고 싶어 ExpressionUtils.as( JPAExpressions .select(memberSub.age.max()) .from(memberSub), "age") )) .from(member) .fetch(); for (UserDto userDto : memberDtoList) { System.out.println("userDto = " + userDto); } } QueryDSL 쿼리 /* select member1.username as name, (select max(memberSub.age) from Member memberSub) as age from Member member1 */ select m1_0.username, (select max(m2_0.age) from member m2_0) from member m1_0 blaze-persistence 쿼리 /* SELECT member1.username AS name, member1.age AS generatedSubquery_1 FROM Member member1 */ select m1_0.username, m1_0.age from member m1_0 blaze-persistence generatedSubquery라 하여, 서브쿼리를 하나의 alias로 처리를 해버렸는데, 후행으로 이 generatedSubquery 에 대한 정의가 따라오질 않습니다... 왜 이런 차이가 나오는지는 모르겠지만 blaze-persistence 활용할 때는 유의해야할 것 같습니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요. 4강에서 처음 프로젝트 열 때, Gradle 2.7.1로 다운그레이드 하였습니다. 원래는 Gradle 3 이상의 버전으로 설정되어 있어서 에러가 났었는데, 자바 17이상일 때, Gradle 3 이 사용가능한 모양이더군요. 해서 Gradle 2.7.1로 다운그레이드해서 급한 문제는 해결했는데.. 이대로 진행해도 문제가 되지 않을까요??
안녕하세요? 먼저 코딩테스트 강의에서 질문하는 것에 양해말씀 드립니다. 코딩테스트 강의 덕에 어느 게임사 대기업 코딩테스트 통과했는데요, 그 다음 기술면접(CS 면접 등)에 대해 불합하였습니다. 그래서 CS 공부를 위해 'CS 지식의 정석'구매를 고려중인데, 게임사에서도 'CS 지식의 정석' 강의가 공통으로 유효한지? 질문 드리고 싶습니다. 답변 미리 감사합니다. 수강자 올림.
강의에서는 controller 만 Mock를 사용했는데 service쪽도 테스트할떄도 Mock으로 테스트를 진행자주 하나요? 2. 이건 개인적인 취향일수도 있는데 dto를 생성할때 재사용성이 없는 class에 내부 클래스 즉 static class를 만들어서 여러개의 class를 만들어서 사용하는 방법도 하시던데 어떤걸 선호 하시나요?
최근에 새로운 프로젝트 진행하면서 Spring Boot 3 버전을 사용하게 됐는데 해당 프로젝트의 Gradle 설정을 구성하면서 다른 분들의 예제를 보면서 작성한 내용을 공유 드립니다. 아래의 내용은 VSCode에서 진행했습니다. 다른 IDE에서는 테스트해보지 않아 다르게 동작할 수도 있는 점 양해 부탁드립니다. 먼저 Gradle 설정은 다음과 같습니다. plugins { id "java" id "org.springframework.boot" version "3.0.6" id "io.spring.dependency-management" version "1.1.0" //querydsl 플러그인 추가하지 않음 } ... configurations { ... querydsl.extendsFrom compileClasspath //해당 부분은 그대로 유지 ... } repositories { mavenCentral() } dependencies { ... implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" implementation "com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0" ... } ... 현재 예제에서는 Querydsl의 Gradle 플러그인인 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 를 사용하지 않습니다. 이전 버전에도 있었는지는 정확하게 모르겠지만 Spring Boot 3로 업데이트 되면서 jakarta 패키지를 사용하기 때문에 해당 패키지에 맞는 annotationProcessor를 추가하여 Gradle의 Querydsl 태스크를 대체합니다. (대표적으로 compileQuerydsl) 그리고 configurations 부분의 querydsl.extendsFrom compileClasspath 구문은 그대로 유지합니다. dependencies 부분에서는 Querydsl 관련 패키지 뒤에 :jakarta 를 추가로 입력하고 2 개의 annotationProcessor을 추가해줬습니다. Spring Boot 3 초기에 지원되지 않았던 P6Spy의 경우 2월 10일에 1.9.0 버전으로 업데이트 되어 정상적으로 지원합니다. 그리고 기존에 김영한 님이 가이드 하셨던 코드인 //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 위 코드는 따로 작성하지 않습니다. Querydsl Gradle 플러그인을 통해 Qclass를 생성하는 compileQuerydsl 태스크를 별도로 실행할 필요 없이 프로젝트 빌드 진행 시 annotationProcessor에 의해 Qclass가 자동으로 생성됩니다. (여기서 프로젝트 빌드란 Gradle build 태스크가 아닌 Java workspace 빌드를 뜻함.) 아래의 이미지와 같이 @Entity 파일이 수정될 때 수정한 내용이 즉시 Qclass에 반영되는 것을 확인할 수 있습니다. (좌측 Entity class, 우측 Qclass) 위 설정을 통해 생성되는 Qclass의 위치는 /bin/generated-sources/annotations/{프로젝트 패키지}/{Entity 클래스 패키지}입니다. (예제 프로젝트에서 Qclass의 위치, gitignore 처리되어 있어 회색으로 표시 됨) 만약 annotationProcessor를 추가하고 Querydsl 설정을 같이 추가했다면 Qclass가 중복된다는 오류가 발생하여 프로젝트 빌드가 진행되지 않으니 주의 바랍니다. 해당 소스는 다음 링크에서 확인해보실 수 있습니다. 404-nut-pound/spring-jpa-querydsl-template ( github.com ) 그리고 별도로 MongoDB+Querydsl 설정도 공유해 드립니다. 404-nut-pound/spring-mongodb-querydsl-template ( github.com ) MongoDB는 Gradle 패키지 설정 시 약간 달라지고 @Entity 어노테이션은 동일하게 사용합니다. 그리고 Querydsl MongoDB 패키지는 JPAQueryFactory를 지원하지 않고 Morphia 패키지를 사용해서 MorphiaQuery라는 객체를 사용하는데 공식 가이드를 봐도 해당 객체를 초기화하는 방법을 알 수 없어서 Repository 인터페이스에 QuerydslPredicateExecutor를 상속하여 사용하는 식으로 구성했습니다.
지금 현재 동아리 내부에서 스프링은 김영한 강사님 꼭 들어야 한다는 말과 함께 열심히 수강하고 있는 학생입니다. 지금 JPA 활용 2편까지 거의 수강하고 있습니다. 활용편까지 들으면서 이것저것 해보고 싶은게 많더라고요? 로그인도 해보고 싶고, 결제기능도 해보고 싶고, 쿠키, 세션 등 다양한 것을 해보고 싶습니다. 그렇기 때문에 스프링 MVC 강의도 꼭 듣고 싶고요! 근데요!!!!!! 요즘에는 다 API 방식으로 개발을 한다고 하잖아요? 1번)혹시 스프링 MVC 강의에서 API 방식으로 로그인이나 쿠키나 세션 같은 부분을 다룰까요??? 이 부분이 1번으로 일단 궁금하고요!(물론 그거와는 별개로 제가 MVC강의도 사서 들을 거긴 합니다!) 2번) 결재기능이라던지 이런 추가적인 기능, 소셜 로그인 기능을 사용한다던지 이런 것은 그냥 구글링으로 공부하시는 걸 추천하시나요? 당초 잘 정리되어 있는 책이나 그런 것을 먼저 학습하고 거기에다가 조금씩 살붙이는 걸 좋아하는 편이라서 보고 공부하신 책이라도 있을까요?
3월부터 준비했으면 널널하게 붙을거같은데 4월 중순부터 시작해서 ㅠㅠ 근데 열심히 JS 공부 안했어요 문제는 반복문 구현1, 문자열비교 1, DFS연결요소(유기농배추)1 이렇게 나왔는데 C++로는 풀겠는데 JS로는 못 풀겠더라구요 열심히 안 한 이유가 제가 공부하는 시간이 1년이 채 안되는데 이렇게 개발자 되는게 맞나 싶기도 하고 그래서 데브코스 가면 안 될거같아서 안 했거든요? 나중에 후회 하려나요 일단은 싸피 신청하려고 생각중입니다..
현 시점 (2023.04.23) 기준 spring boot 2.x 의 최신버전인 spring boot 2.7.10 에서 강의 자료의 https://github.com/gavlyukovskiy/spring-boot-data-source-decorator 의 p6spy 최신 버전인 1.9.0 사용 했을떄 p6spy로그가 찍히지 않네요 추가 설정을 통해서 해결할 방법이 있을것으로 추측되지만.. 귀찮으신 분들은 그냥 강의에서 사용했던 p6spy 1.5.6 버전을 그냥 사용 하시면 문제없이 출력이 되니 참고하실분들은 참고하세요 ㅎㅎ
안녕하세요. 강사님. 강의를 들으면서 사내 직무변경 테스트를 준비하는 직장인입니다. 직무변경을 위한 코딩테스트에는 알고리즘 문제 위주로 출제가 되며, 프로그래머스 1레벨급 2문제, 2레벨급 1문제가 출시된다고 명시되어 있고 현재 3문제 모두 푸는 것을 목표로 하고 있습니다. 평소엔 출퇴근 시간 및 퇴근 후 시간을 이용하여 공부를 진행하고 있는데, 7월초(테스트 일정 변경 감안할 경우 6월 중순)에 테스트가 진행될 예정이라 최대한 효율적으로 공부하고자 합니다. 1~9주차 커리큘럼 중 특히 집중하면 좋을거 같은 주차 혹은 내용 등 조언 부탁드립니다. 감사합니다.
안녕하세요 선생님! 다름이 아니고 제가 알고리즘을 공부한지는 1달밖에 되지 않았지만(그것도 겨우 하루 2시간) 경험을 쌓아보고 싶어서 네이버 신입채용 tech를 지원해 합격은 생각하지 않고 오늘 코딩테스트를 치뤘는데요. 역시 아직 제겐 너무 어려워서 1문제만 테스트 케이스를 겨우 통과했습니다... 여기서 질문인 점이 사실 제가 풀 수 있었던 이 한 문제는 테스트 케이스의 입력이 흔히 cin >> n >> k; 이런 형태여서 쉽게쉽게 늘 하던데로 풀 수 있었는데 다른 문제 경우에는 테스트케이스의 입력이 배열로 받더라고요... 예를 들어서 [[0, 0, 1], [1, 0, 1], [0,1,0]] 이런식으로요. 심지어 각 배열의 크기가 몇인지도 정해져 있지 않고 또, 배열의 개수조차 정해져 있지 않아서 도저히 입력을 어떻게 받아야할지 몰라 풀이만 적고 테스트를 돌려보진 못했습니다ㅠㅠㅠ 혹시 이런 입력같은 경우에는 코드를 어떻게 작성해야 입력을 받을 수 있나요?