앞선 수강생처럼 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.Mon Oct 30 21:40:32 KST 2023There was an unexpected error (type=Internal Server Error, status=500).An error happened during template parsing (template: "class path resource [templates/members/memberList.html]")org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/members/memberList.html]") 여기서 zipcode받는 부분을 html부분에서 빼고 받지 않으면 실행이 됩니다. 그런데 zipcode를 받는 부분이 문제가 없어보이는데... 계속 검토중이긴 합니다만..혹여나아시는게 있을까 싶어서..
안녕하세요 강사님 ! spring boot를 사용해서 프로젝트를 만든 경험은 있지만 주변 실무자들이 제가 구현한 방식이 올드한 편이라는 피드백을 받고 강사님 spring 기본편과 jpa 해당 강의를 수강하고 있는 학생입니다 ! 저는 보통 냅다(?) 코드를 치면서 전체적인 흐름을 공부한 뒤 이해가 안 가는 부분을 찾아보는 편이라 스프링 강의를 순차적으로 다 듣는 대신 jpa 강의를 먼저 수강 중인데요. 해당 강의를 다 수강한 뒤에 jpa를 활용한 spring 프로젝트 강의를 듣고 난 후 해당 강의를 다시 보고 이 다음 jpa활용 2편을 들으려 합니다. spring 로드맵에서 어떤 강의를 듣는게 좋을지 추천해주실 수 있을까요 ?
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 활용할 때는 유의해야할 것 같습니다.
함수에 대해 정의내릴 때 예를 들어 코랩 에서는 scaler = minmax_scale() 이렇게 정의를 내리고 scaler(data) 하는데 #코랩은 정의내릴 때 괄호를 빼면 동작안함 구름에서 테스트해보니까 scaler = minmax_scale()하고 scaler(data)하면 에러가 발생하고 괄호없이 scaler = minmax_scale 만해야 에러가 발생하지 않더라구요. 이게 구름 환경만의 특성이라서 그렇다고 보면 될까요?
JPA 강의에서 EntityManagerfactory를 하나 만들어서 EntityManager가 필요할때마다 만들고 close()하는 방식으로 해야한다고 들었는데 스프링 부트에서는 private final EntityManager em; 이렇게 등록된 Bean에 대해서 의존성을 주입해서 만들게되면 문제가 없나요?? 이렇게 private final EntityManager em;로 하는 방식도 해당 객체가 생길때마다 새로 em이 만들어지는건가요??
test path에서 Lombok을 사용 할 경우, jar Build 과정에서 Lombok으로 인한 Build Failed가 발생합니다. (CMD) Task :compileTestJava FAILED error: package lombok does not exist error: cannot find symbol @Getter, @Setter, ... ... 해당 경우, 아래와 같이 build.gradle에 의존성을 추가하면 해결 가능합니다. 참고하시면 좋을 것 같습니다. (build.gradle) dependencies { testCompileOnly 'org.projectlombok:lombok:1.18.22' //테스트 환경에서 주입 testAnnotationProcessor 'org.projectlombok:lombok:1.18.24' //테스트환경의 어노테이션 주입 }
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
안녕하세요 저는 비전공자이고 풀스택 전과정 + 고급 크롤링 강의를 듣고있는 수강생입니다. 우선 너무 좋은 강의 정말 잘 듣고 있습니다. 저는 코딩을 아예처음 접하고있어서 어느쪽으로 가고싶은지 전혀 갈피가 없었는데요. 하다보니 데이터과학이 제가 하고싶었던 분야라는것을 알게되었습니다. 항상 외주로 개발자를 구해서 돈을 주고 프로그램을 제작하는것을 자주해왔는데요. 개발비로도 2000만원이상을 쓴것 같습니다. 그런데 제가직접 해보고자 이곳을 찾아왔고, 데이터 과학이 제가 생각한 분야라는것을 고급크롤링 강의들으면서 알게되었습니다. 그런데 궁금한점은 개발자에게 외주를 맡기면서 항상 GUI 방식의 프로그램을 받아서 그것으로 크롤링 및 자동화 프로그램들을 주로 외주를 맡겨왔었는데요. 강의 내용을 계속보고있는데 GUI 에 관한건 없더라구요. 제가 못찾는건지 별도 다른강의가 있는건지 알고싶습니다. 저는 GUI에 자동화 소스를 버튼처럼만드는 그런 프로그램을 만들고 싶거든요 ! 강의내용의 질문은 아니지만, 그 강의가있다면 추가로 구매해서 수강하고싶습니다. 답변 부탁드립니다
안녕하세요 항상 강의 잘 보고 있습니다. 다름이 아니라 영한님의 jpa강의를 토대로 제가 하는 토이프로젝트에 적용하는 과정에서 궁금한 점 몇가지가 생겨서 질문드립니다. application.yaml파일에서 ddl-auto: create-drop으로 했을때 콘솔창에서는 해당 테이블이 없다면서 자꾸 오류가 났었습니다(콘솔에서는 오류가 나오나 DB상으로는 적절하게 테이블이 생성되었음). 그러나 먼저 ddl-auto: create로 해당 테이블들은 생성해놓고 그 다음 update를 하니 오류없이 동작했습니다. 강의를 들을때는 그러지 않았던것 같았는데 원래 이런건가요? 영한님께서 강의 도중 다대다 관계는 1대다, 다대1 관계로 풀어서 진행하라고 하셨던 기억이 납니다. 그렇게 하는 이유에 대해서는 이해를 하였습니다. 저는 기존의 관계형 데이터 베이스에서는 기존의 다대다 관계를 이루고 있던 테이블들의 pk를 가져와서 새로운 테이블에 FK로 넣었고 이러한 두개의 FK를 묶어서 하나의 PK로 만들었습니다. 그러나 강의에서는 기존의 테이블들을 이어주는 테이블에 FK로 넣어주기는 하였으나 아예 새로운 PK를 만들어서 강의를 진행하시던 기억이 납니다. 여기서 제가 궁금한 점은 기존에 제가 했던 방식대로 하려면 @Embedable으로 복합키를 만들어서 진행을 해야할까요? 아니면 기존 하던 방식 말고 새로운 PK를 만들어서 진행하는 방식이 훨씬 깔끔할까요? 제가 진행하는 토이프로젝트의 환경은 aws ec2를 사용하고 있으면 DB는 mariadb를 사용하고 있습니다. 자바 버전은 17입니다.