49,500원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
RuntimeException
안녕하세요. 좋은 강의 올려주셔서 많이 배우고 있습니다ㅎㅎ나만의 DI프레임워크 만들기 강의중 Exception이 발생했을 때 RuntimeException으로 감싸주시는데, 어떤 의도이신지 궁금합니다!감싸는 이유가 있을까요??
- 미해결더 자바, 코드를 조작하는 다양한 방법
Annotation processor에서 element type을 제한했는데도 다른 타입으로 컴파일이 됩니다...이상하게도..
안녕하세요, 애노테이션 프로세서에서 테스트하는 @Magic 을 테스트하면서,process 메소드에서 분명 inteface element에서만 작동되고 아니면 erorr를 발생하도록 했는데...실제로 제가 프로젝트를 만들어서 class에다가 @Magic을 적용해도, 에러없이 정상적으로 컴파일이 됩니다.... 빌더는 gradle을 사용하고 있구요... 지금까지 한번도 실패한적이 없이 테스트 잘 되고 있었는데.. 실패해야할 컴파일이 정상이되어서 이해가 않되서 질무을 올려봅니다..아래는 process method:class에 @Magic 적용했는데도 정상인 화면입니다혹시 몰라서 다시 한번 똑같이 프로젝트 만들었습니다. 이번엔 빌드 정보까지 스크린캡쳐했습니다.
- 미해결더 자바, 코드를 조작하는 다양한 방법
gradle 사용하시는 분 도움
일단 새로운 프로젝트 만들고 premain 추가해주는 것 까진 강의를 그대로 따라하시면 됩니다. manifest plugin 부터 조금 차이가 있어서 거기부터 설명하면, build gradle 에 다음과 같이 추가한다.tasks.named('jar') { manifest { attributes( 'Implementation-Title': project.name, 'Implementation-Version': project.version, 'Premain-Class' : "com.java.magicianAgent.MagicianAgent", 'Can-Redefine-Classes' : true, 'Can-Retransform-Classes' : true) } }터미널에서 다음 명령어를 통해 build 한다./gradlew clean buildbuild.libs file 안에 있는 jar file 을 확인한다. (옵션)강의에서와 마찬가지로 zip file 로 변경하면 확인가능합니다. 저같은 경우 SNAPSHOT.jar 과 SNAPSHOT-plain.jar 이렇게 2개가 생겼는데 SNAPSHOT.jar 은 제가 spring boot 로 실행서 그런지 관련 설정들이 보이고 SNAPSHOT-plain.jar 이 맞는거 같더라구요. jar file 의 절대 경로를 복사해 VM option 에 추가한다. 여기서부터는 다시 강의와 같습니다. VM option 이 안보이시면 오른쪽에 Modify options 클릭하면 add vm options 라고 보이실 겁니다. 이상한거나 궁금한거 있으시면 말씀해주세요. gradle 을 쓰시는 모든 분들도 마술을 성공시킵시다 하하
- 해결됨더 자바, 코드를 조작하는 다양한 방법
CGLib를 따라 해보면서 문제점이 있으며, 해결법입니다. JDK17입니다.
JDK17을 사용하면서, `Spring`의 추가를 하지않고 진행을 하면서 보니 아래의 이미지와 같은 오류가 발생하네요.확인을 해보니, JDK16부터 Issue가 발생되었던것 같아보입니다. 제가 참고한 글은 https://github.com/cglib/cglib/issues/191 글이었습니다. 해결법은 위의 issue에 나와있는 그대로, VMOptions항목에 --add-opens java.base/java.lang=ALL-UNNAME를 추가하였습니다. 아래의 사진처럼요.혹시 실습해보고 싶은데 안되는 분들중, 유사한 오류가 나시는 분들은 참고하시기 바랍니다.
- 미해결더 자바, 코드를 조작하는 다양한 방법
Spring Data JPA 동적 프록시를 사용 질문
안녕하세요! 강의를 듣다가 궁금한 것이 생겨 질문 남깁니다 :) 찾아보니까 Spring 에서는 기본적으로 다이나믹 프록시를 사용하고, Spring Boot 에서는 기본적으로 CGLIB 사용으로 바뀌었다고 나와있습니다! Spring Boot 에서 Spring Data JPA 를 사용하여 Repository를 만들 때는 인터페이스 기반이기 때문에 디폴트 설정인 CGLIB 대신 다이나믹 프록시를 사용하는 것으로 이해했는데 맞을까요?!
- 미해결더 자바, 코드를 조작하는 다양한 방법
어노테이션 프로세서 활용 예와 관련해 질문 있습니다.
'마무리' 한 강 남았네요.덕분에 많이 배우고 많이 성장한 것 같습니다.그런데, 어노테이션 프로세서 활용과 관련해서,, QueryDSL 사용 시 생성되는 엔티티의 Q파일도 어노테이션 프로세서를 활용한 기술인지 궁금합니다.짐작으로는 맡긴 한데, 관련 언급이 없었어서요.
- 해결됨더 자바, 코드를 조작하는 다양한 방법
"자바 언어가 플랫폼에 독립적이다" 라는 것에 대해 옳게 이해했는지 궁금합니다!
선장님 안녕하세요!자바 언어가 플랫폼에 독립적이다에 대해 제가 옳게 이해했는지 궁금해서 질문드립니다!강의 자료의 JDK부분에, 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적이라는 설명이 있습니다.이것에 대해 저는JVM은 바이트 코드를 OS에 맞게 기계어로 변환해야하므로 플랫폼에 종속적이고(JRE, JDK역시 JVM을 포함하므로 플랫폼에 종속적),Java 언어는 소스코드를 작성해서 바이트 코드로 변환하는 컴파일하는 과정 자체는 어떤 플랫폼에서도 동일하므로 플랫폼에 독립적이다.(바이트 코드는 어떤 플랫폼이든 동일하기 때문에) 라고 이해했습니다. 혹시 제가 이해한 것이 맞을까요?항상 좋은 강의 제공해주셔서 감사합니닷!
- 미해결더 자바, 코드를 조작하는 다양한 방법
'클래스 로더' 강의에서 클래스 로딩을 설명할 때 잘못된 것 같아 질문드립니다.
클래스로딩을 진행할 때 먼저 자식 클래스로더가 찾아보고 찾지 못할 경우 부모 클래스로더에게 위임하는 것으로 '자바 성능 최적화' 라는 책에서 배웠습니다. 하지만 강의에서 08분02초부터 클래스로딩 개념을 설명해주실 때 제일 먼저 부모 클래스로더에게 위임한다고 설명해주시는데 이 개념이 잘못된 개념인 것 같아 조심스럽게 질문남깁니다. chatGPT에게 물어봤을 때도 동일하게 자식 클래스로더가 먼저 찾아보고 부모에게 위임한다고 답변을 줍니다.
- 미해결더 자바, 코드를 조작하는 다양한 방법
metaspace 질문드립니다.
안녕하세요 강의 잘 듣고 있는 수강생입니다.하나 질문이 있어 글 남깁니다. Java 8로 넘어오면서 permgen 영역이 native memory의 metaspace로 넘어왔다고 알고 있습니다. 이때 헷갈리는 부분이 jvm 의 메모리 중 method area와 metaspace는 다른 건가요?class들의 metadata를 저장하는 공간으로 알고 있는데 이 역할을 method area에서 하는 거로 알고 있어서..
- 미해결더 자바, 코드를 조작하는 다양한 방법
소스컴파일시점에 MagicMojaProcessor가 사용되면 안되는이유
소스를 컴파일하는 시점에 저 annotation이 사용되면안되는데 사용되려해서 에러가 난다는데 왜 컴파일하는 시점에 저 annotation이 사용된다는건가요? 헷갈리네요ㅠㅠ프로세서를 등록하는 과정에서 어노테이션이 사용이 되는데 어노테이션의 생명주기를 source레벨로 해놔서그런건가요?그런데 CLASS레벨로 해놔도 똑같이 안되네요.. 이유를 잘 이해하지 못하겠어요 왜 저 에노테이션이 사용되면 안되는지 궁금합니다소스 컴파일하는 과정에서 MagicMojaProcessor가 동작하려고하는데 그 시점에서는 MagicMojaProcessor가 없어요. 왜 없는거죠?원래는 다음과 같이 동작을해야해요MagicMojaProcessor 컴파일컴파일된 파일을 가지고 META-INF에서 사용근데 2->1 로 과정이 일어나기때문에 오류가 발생한다는얘기인가요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
다이나믹 프록시에서 리플렉션이 어떻게 사용되는거죠?
ParentInterface parentInterface = (ParentInterface)Proxy.newProxyInstance(HelloApplication.class.getClassLoader(), new Class[]{ParentInterface.class}, (proxy, method, args) -> {System.out.println("메소드 수행전에 할일");Object methodResult = method.invoke(new ChildClass(), args);//child라는 class에 args를 모두 넘긴다if(method.getName() == "sayHello"){//메서드 이름에 따라.. 처리를 분류할 수 있으니 다 정의하지 않아도됨 모든 메서드에 대해 기본적으로 정의되는거니까 중복도 피할 수 있음System.out.println("sayHello!");return methodResult;}System.out.println("sayOne!");return methodResult;});parentInterface.sayHello();//클라이언트는 인터페이스타입에 대해 그 메서드를 호출한다 이 인터페이스에 대한 메서드를 호출하면 위에서 정의한대로 프록스 객체를 런타임에 하나 만들어줘서//위에서 정의한 대로의 로직을 타고 클라이언트에게 결과를 전송해준다parentInterface.sayOne(); 지금 인터페이스에 대한 .class정보를 넘겨주고 있어요그리고 Proxy.newProxyInstance메서드로 들어가보면 넘겨준 class정보를 가지고 생성자를 만든다거나 하는것같거든요그런거 자체가 리플렉션을 활용하는 행위인가요?(class이름).class <- 이표현자체는 리플렉션을 활용하는 문장인가요?cglib, 바이트 버디는 리플렉션을 사용하지 않나요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
다이나믹 프록시의 단점
세번째 인자로 넘기는 new InvocationHandler가 너무 커지게 되면 부담스럽다 라고 하셨는데따로 클래스를 작성해서 넘겨주면 저 코드도 간결해지는것 아닌가요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
new 와 constructor.newInstance();의 차이
Class<?> bookClass = Class.forName("thejava.reflection.MyBook");Constructor<?> constructor = bookClass.getConstructor(null);//인자 없는 생성자를 넘겨받아서MyBook book = (MyBook) constructor.newInstance();이렇게 인스턴스를 생성하는것과new MyBook()이랑은 무슨차이죠?둘다 출력해보면thejava.reflection.MyBook@~ 로 나오는데.. 같은건가요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
두번 실행해야하는 이유
1. 바이트 코드 조작2. 조작된 코드를 메모리에 올려야함이래야하는데 코드는 바이트코드조작 -> 클래스사용 순이지만조작되기전 클래스가 메모리에 로드됨 -> 바이트 코드 조작됨 -> 메모리에 로드됐던 클래스를 사용하여 메서드 호출이런 순서이기 때문에 바이트코드를 조작하는 코드와 클래스를 사용하는 코드를 동시에 실행하는것만으로는 조작된 코드를 사용할 수 없어요제가 설명한게 맞나요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
제가 설명한게 맞는지 봐주실 수 있나요?(jvm설명)
jvm은 자바파일을 실행하기 위한 가상의 컴퓨터다자바파일만으로는 cpu가 인식하지 못하므로 기계어로 컴파일하는 과정을 거쳐야 실행할수있다그 일을 해주는것이 jvm이다 jvm은 java파일을 기계어로 바로 변환하진 않는다왜냐하면 바로 기계어로 변환하려면 os에 종속적이될수밖에 없기때문이다.os마다 기계어의 문법(?)이 다르기 때문에 같은 기계어여도 다르게 해석된다.os에 종속적이지 않기 위해 jvm은 jvm이 인식할 수 있는 자바 바이트코드(.class파일)로 변환한다그리고 os에게 해석을 해준다. 그러면 os에 종속적이지 않게된다.
- 미해결더 자바, 코드를 조작하는 다양한 방법
JIT 컴파일러와 인터프리터
안녕하세요, 백기선님.기존에 저는 JVM 내에서 JIT이 컴파일러와 인터프리터의 역할을 동시에 수행한다고 이해하고 있었는데요.자료(p.4)에서는 [실행엔진 : 인터프리터, JIT Compiler, GC ] 로 구성되어 있어서 질문드립니다.인터프리터와 JIT 컴파일러는 서로 분리되어 역할을 수행하는 것이 맞고,바이트 코드를 실행할 때, JIT 컴파일러가 전체를 싹 훑고, 반복되는 코드에 대해 메모리에 캐싱을 진행한 후, 인터프리터가 처음부터 순차적으로 읽어 나가다가, 반복되는 해당 지점에서 JIT Compiler가 다시 개입하여 캐싱된 코드를 꺼내오는 형태일까요? 이 부분이 조금 헷갈리기도 하고, 궁금하기도 합니다.혹은 어떤 문서를 보면 공부해볼 수 있을까요?(한국어 블로그에는 대부분 인터프리터와 JIT이 같다고 적어둔 경향이 많은 것 같고, 기선님께서 참고에 올려주신 글이나 해외 블로그에서는 둘을 분리해서 말하는 경향이 있는 것 같아서 더 헷갈리는 것 같습니다.)감사합니다!* 아래 질문과 비슷한 내용이지만, 답변 달아주신 링크에 접속이 안되서 부득이하게 다시 질문 드립니다ㅠhttps://www.inflearn.com/questions/99765
- 해결됨더 자바, 코드를 조작하는 다양한 방법
Method.invoke()
Object 타입인 인스턴스를 invoke()의 매개변수로 넘겨도 실행 되는 이유는 실제 인스턴스가 Book 타입의 인스턴스이기에 상관 없는걸까요?
- 미해결더 자바, 코드를 조작하는 다양한 방법
site 폴더내에 jacoco 폴더가 생기지 않습니다.
clean varify를 실행하면 [INFO] --- jacoco-maven-plugin:0.8.4:report (report) @ THe_JAVA --- [INFO] Skipping JaCoCo execution due to missing execution data file. 위와 같은 메시지가 나오고 유사한 질문이 있어 그에 맞춰 mvn site를 실행해 봤습니다. 아래는 porm.xml 코드입니다. <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>JacocoTest</artifactId> <version>1.0-SNAPSHOT</version> <name>JacocoTest</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.4</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> </build></project> 실행을 하면 site 디렉터리는 생기지만 하위 디렉터리에 jacoo 디렉터리가 생기지 않습니다.
- 미해결더 자바, 코드를 조작하는 다양한 방법
메모리 영역의 구조 질문
메모리 영역은 스택, PC, 네이티브 메소드 스택, 힙, 메소드영역으로 나뉜다고 말씀주셨는데요, static 변수나 메소드의 경우 메소드영역에 저장되는것으로 이해하였는데 다른 블로그에 기술되어 있는 명칭은 static 메모리에 저장된다고 기술되어 있더라구요. static 메모리 와 메소드 영역 같은 것인건가요? https://gocoder.tistory.com/1847
- 미해결더 자바, 코드를 조작하는 다양한 방법
GC 설명부분 질문드립니다.
GC 는 크게 쓰로우 풋 위주의 GC 와 stop the world 를 줄이는 GC 두가지가 있다 말씀주셨는데요 여기서 쓰로우 풋 위주의 GC 는 어떤 키워드로 검색을 해봐야 조금 더 자세히 공부를 해볼 수 있을까요?