게시글
질문&답변
2024.04.16
gradle 추가 오류
안녕하세요. gump님 기존 설정에서 lombok 설정 추가 시작, 끝 부분만 추가 해주시면 됩니다. 다음 내용을 복사해서 붙이셔도 됩니다 🙂 plugins { id 'java' id 'org.springframework.boot' version '3.2.4' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } //lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProcessor } } //lombok 설정 추가 끝 repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' //lombok 라이브러리 추가 시작 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //lombok 라이브러리 추가 끝 testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } tasks.named('test') { useJUnitPlatform() } 감사합니다.
- 0
- 1
- 33
질문&답변
2024.04.16
강의 26분 부터 진행이 안도고 500 에러 발생합니다
안녕하세요. 양치잘하기님 현재 2가지 문제가 있습니다. 다음 코드를 보면 uploadFIleName으로 되어 있는데, 이것을 읽어들이는 view 에서는 getUploadFIleName()으로 잘못 되어 있습니다. FIle -> File로 대소문자를 다시 정리해주세요. package hello.upload.domain; import lombok.Data; @Data public class UploadFile { private String uploadFIleName; private String storeFileName; public UploadFile(String uploadFIleName, String storeFileName) { this.uploadFIleName = uploadFIleName; this.storeFileName = storeFileName; } } item-view.html 상품 조회 상품명: 상품명 첨부파일: (사진) 이미지가 보이지 않는 문제는 ItemController에 /images를 처리하는 다음과 같은 메서드가 없습니다. @ResponseBody @GetMapping("/images/{filename}") public Resource downloadImage(@PathVariable String filename) throws MalformedURLException { return new UrlResource("file:" + fileStore.getFullPath(filename)); } 강의 내용과 메뉴얼 그리고 소스 코드를 참고해서 추가해주세요. 참고: 강의를 진행하다보면 코드가 실행되지 않을 경우가 있는데요. 이럴 때는 제공해드린 강의 소스 코드를 참고해주세요. 제가 추천하는 방법은 강의 소스코드에 있는 파일을 하나씩 복사해서 내 프로젝트에 붙여넣기 하면서 실행해보는 것입니다. 그러면 문제가 되는 파일을 빠르게 찾을 수 있습니다. 강의 소스 코드 링크 https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2&unitId=83250&tab=curriculum 감사합니다.
- 0
- 1
- 74
질문&답변
2024.04.16
concrete proxy controller에는 requestmapping이 없지 않나요?
안녕하세요. blackjack_96님 @Inherited 적용하지 않으면 자바 문법상 부모 클래스의 애노테이션을 자식 클래스가 상속 받지 않습니다. 스프링은 내부에서 여러가지 설정을 할 때 부모 클래스에 있는 애노테이션을 읽어서 처리하는 장치들이 되어 있습니다. 이 부분은 자바 문법상 되는 것은 아니고 스프링이 특별하게 처리해주는 것으로 이해하시면 됩니다. 감사합니다.
- 0
- 1
- 32
질문&답변
2024.04.16
CGLIB 와 클래스 로딩시점의 차이..
안녕하세요. 리어스리님 CGLIB와 AspectJ에 대해 혼동이 있으신 것 같습니다. 먼저, 이 두 기술은 Java에서 AOP(Aspect-Oriented Programming)를 구현하기 위한 다른 접근 방식을 제공합니다. 두 기술 모두 바이트 코드 조작을 통해 작동하지만, 그 방식과 적용 시점에 차이가 있습니다. CGLIB CGLIB (Code Generation Library)는 런타임에 프록시를 생성하여 바이트 코드를 조작합니다. CGLIB는 주로 타겟 객체의 서브 클래스를 동적으로 생성하고, 이를 통해 메서드 호출을 가로채 AOP를 구현합니다. 이렇게 생성된 서브 클래스는 원래 클래스의 프록시 역할을 하며, AOP의 관점에서 원하는 기능(로깅, 트랜잭션 관리 등)을 추가할 수 있습니다. CGLIB가 프록시를 사용하는 이유는 바이트 코드 조작 자체만으로는 원본 객체의 행동을 변경하거나 확장하기 어렵기 때문입니다. 프록시를 통해 원본 객체를 감싸고, 이 프록시에서 추가적인 기능을 실행한 후 실제 객체의 메서드를 호출하게 되므로, 사용자는 원본 객체를 수정하지 않고도 원하는 기능을 적용할 수 있습니다. AspectJ AspectJ는 컴파일 시간(또는 클래스 로딩 시간)에 바이트 코드를 조작합니다. AspectJ는 특히 더 강력한 AOP 기능을 제공하며, 이는 컴파일 시점에 소스 코드 또는 클래스 파일에 직접적인 바이트 코드 조작을 통해 이루어집니다. AspectJ는 프록시를 사용하지 않고 바로 바이트 코드를 조작하여, 원하는 AOP 기능을 클래스에 직접 삽입합니다. 이로 인해 실행 시에 추가적인 객체 생성이나 호출이 필요 없으며, 성능상의 이점을 가질 수 있습니다. CGLIB와 AspectJ의 차이점 조작 시점 : CGLIB는 런타임에, AspectJ는 컴파일 시간 또는 클래스 로딩 시에 조작합니다. 프록시 사용 : CGLIB는 프록시를 사용하여 메서드 호출을 가로챈다. AspectJ는 프록시 없이 직접 클래스의 바이트 코드를 변경합니다. 성능 : AspectJ는 컴파일 시간에 바이트 코드를 조작하기 때문에, 런타임에 성능 이점을 가질 수 있습니다. 반면, CGLIB는 런타임에 프록시 객체를 생성하므로, 이에 따른 오버헤드가 발생할 수 있습니다. 바이트 코드를 조작하는 기술을 사용하더라도, CGLIB가 프록시를 사용하는 이유는 런타임에 유연성을 제공하고, 원본 코드를 변경하지 않고도 동적으로 기능을 추가할 수 있기 때문입니다. ( 실무에서 AspectJ를 적용하려면 여러가지 제약이 있기 때문에 사실 도입이 쉽지 않습니다. 대신에 CGLIB는 바로 도입할 수 있습니다. ) 감사합니다.
- 0
- 1
- 42
질문&답변
2024.04.15
오타 - 불변객체 문제풀이 문제 설명, 클래스 이름 오타
생각하는자님 고맙습니다 🙂 다음 버전에 패치할게요 🙂
- 0
- 1
- 71
질문&답변
2024.04.13
Q클래스 import 불가 오류
안녕하세요. 김세희님 죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다. 저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다. 참고로 Querydsl 설정 관려해서 다음을 보시면 도움이 되실거에요. https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.iayahq64el0u 감사합니다.
- 0
- 2
- 82
질문&답변
2024.04.13
중첩 정적 클래스의 인스턴스화가 가능한 이유
안녕하세요. 유재준님 정적 클래스 는 인스턴스화 할 수 없다는 것이 어떤 의미인지 잘 이해가 되지 않습니다. 말씀하신 정적 클래스가 어떤 것인지 실행 가능한 예제 코드를 만들어주시겠어요?
- 0
- 1
- 68
질문&답변
2024.04.13
HttpEntity를 특별히 사용해야만 하는 상황이나 사용할떄의 장점이 있나요?
안녕하세요. 양치잘하기님 강의 내용중에 다음 내용을 참고해주세요 🙂 *HttpEntity는 응답에도 사용 가능** * 메시지 바디 정보 직접 반환 * 헤더 정보 포함 가능 감사합니다.
- 0
- 1
- 53
질문&답변
2024.04.13
인라인을 사용할 때의 이스케이프 처리와 인라인을 안 쓸 때의 이스케이프 처리 차이
안녕하세요. 11 1님 이 케이스는 저도 정확히 잘 모르겠습니다. 관련해서 아시는 분 있으면 답변 부탁드려요. 감사합니다.
- 0
- 1
- 67
질문&답변
2024.04.13
트랜잭션에 대해서 질문있습니당 ㅠㅠ
안녕하세요. dionisos198 지금 설명하신 부분에서 JPA는 락에 관여하는 부분이 없습니다. JPA의 변경감지는 단순히 UPDATE 쿼리를 실행하는 것이 전부입니다. 물론 처음 엔티티를 조회할 대 SELECT 문도 함께 실행될 수 있습니다. JPA와 스프링은 여기서 단순히 트랜잭션을 실행하고 DB에 데이터를 insert하고, update하는 것이 전부입니다. 따라서 이 과정을 자세히 이해하려면 JPA보다는 단순히 JDBC와 SQL을 사용해서 테스트 해보시는 것을 권장드려요. 물론 그것 보다는 DB에서 제공하는 SQL 실행 가능한 툴을 사용해서 트랜잭션을 시작한 다음에 단순히 SQL등을 실행하면서 락의 상태를 확인해보는 것이 더 단순하고 나은 방법이라 생각합니다. 감사합니다.
- 0
- 1
- 46