개인공부 97

포인트컷 지시자의 종류

포인트컷 표현식은 `execution` 같은 포인트컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다. 포인트컷 지시자의 종류 `execution` : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. `within` : 특정 타입 내의 조인 포인트를 매칭한다. @Test void withinExact() { pointcut.setExpression("within(hello.aop.member.MemberServiceImpl)"); assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue(); } @Test void withinStar() { pointcu..

개인공부 2024.01.09

jdk동적프록시

jdk동적프록시는 인터페이스를 가지고 만든다. @Test void dynamicA() { AInterface target = new AImpl(); TimeInvocationHandler handler = new TimeInvocationHandler(target); // newProxyInstance()의 파라미터1= 어느 프록시를 어느 클래스 로더에할지. 파라미터2= 어떤 인터페이스를 기반으로 프록시를 만들지. 파라미터3= 프록시가 사용해야할 로직. AInterface proxy = (AInterface) Proxy.newProxyInstance(AInterface.class.getClassLoader(), new Class[]{AInterface.class}, handler); proxy.call(..

개인공부 2024.01.03

security 요청 설정

authorizeRequests() : 요청에 대한 권한 지정. Security 처리에 HttpServletRequest를 이용한다는 것을 의미한다. antMatchers() : 특정 경로를 지정합니다. 보통 뒤에 다른 메서드가 붙습니다. anyRequest() : 설정한 경로 외에 모든 경로를 뜻합니다. authenticated() : 인증된 사용자만이 접근할 수 있습니다. permitAll() : 어떤 사용자든지 접근할 수 있습니다. hasRole() : 특정 ROLE을 가지고 있는 사람이 접근할 수 있습니다. hasAuthority() : 특정 권한을 가지고 있는 사람만 접근할 수 있습니다. hasRole과 비슷하다고 볼 수 있습니다. csrf() : CSRF 보안에 대한 설정입니다. 아무 설정도 ..

개인공부 2023.07.08

SSL의 동작방법

SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 사용한다. 클라이언트가 서버에게 자신의 공개키를 보내고 서버도 클라이언트에 자신의 공개키를 전송한다. 그리고 클라이언트는 서버에게 데이터를 보낼때 서버에게 제공 받은 공개키로 데이터를 암호화해서 전송한다. 그러면 서버는 데이터를 받아서 그 데이터를 복호화를 한다. 그래서 중간에 공개키를 탈취당하거나 감청을 당해도 비밀키를 가지고 있지 않으면 그 데이터를 복호화 할수없다. 하지만 이 방식을 사용하지 않고 있는데 이유는 공개키방식은 암호화를 하고 복호화를 하는 과정에서 컴퓨팅파워를 많이 사용하기 때문에 성능 문제가 생길수 있어서 이다. 그래서 공개키 방식만 사용하지 않고 대칭키와 공개키 두가지 방식을 가지고 사용한다. 이렇게 하면 성능 이슈도 해..

개인공부 2023.03.21

빌드

빌드할때 터미널에서 빌드할 프로젝트 파일 위치로 가서 ./gradlew build를 해주면 /build/libs위치에 .jar이라는 파일이 두개 생성되는데 plain.jar은 라이브러리가 없는 그냥 기본 어플리케이션만 있는 파일이고 .jar로 되어있는걸 띄우면 된다. 물론 .jar이 있는 위치에서. 예를들면 나는 ~/Downloads/project/home/build/libs 에 home-0.0.1-SNAPSHOT.jar 파일이 위치해 있다. 실행 명령어는 java -jar home-0.0.1-SNAPSHOT.jar 을 해주면 어플리케이션이 실행된다. 또 ide를 열어서 build.gradle에 들어가보면 옵션으로 bootJar { enabled = true dependsOn asciidoctor cop..

개인공부 2022.11.10

순환참조

빈으로 등록한 A라는 클래스에 B를 주입하고 B라는 클래스에 A를 주입했을때 빈이 생성 시점에 A에 B를 주입시켜주려는데 B가 없어서 B를 만드려고 하니 A를 주입시켜줘야해서 A를 만드려고 B를 주입시켜주려고 하다보니 .. 무한반복 그리고 @Slf4j @Service public class ServiceA { @Autowired private ServiceB serviceB; public void run() { serviceB.run(); log.info("Called ServiceA.run()"); } } @Slf4j @Service public class ServiceB { @Autowired private ServiceA serviceA; public void run() { serviceA.run(..

개인공부 2022.09.27

lombok @Builder

dto에 @Builder를 쓰면 생성자를 생성해서 setter메서드로 변경하는것보다 훨씬 직관적이라고해서 간단히 써봤다. @Data @Builder public class Schema { private String type; private List fields; private boolean optional; private String name; } 서비스로직 에서 Schema schema = Schema.builder() .type("struct") .fields(fields) .optional(false) .name("orders") .build(); Schema클래스에 @Builder를 붙여줬기 때문에 이런식으로 builder()를 이용해서 사용가능

개인공부 2022.09.26

MSA 패턴 분석

클라이언트나 다른 마이크로 서비스들이 API Gateway를 통해서 필요한 서비스를 요청하게 되면 그 요청을 받아서 ServiceRouter에게 어디로 가야할지 질문을 하게 되고 필요한 마이크로서비스가 어디에 저장되어 있는지 ServiceDiscovery(전전 블로그 글에서 설명한 마이크로서비스들이 등록되고 삭제되는 작업을 하는곳)에게 물어보게 된다.그럼 서비스디스커버리에서는 마이크로서비스가 저장된 위치를 알려준다. 그리고 그 서비스로 이동을 해야하는데 서비스는 분산된 형태로 되어 있는데 그때 로드벨런서를 통해서 어떤 서비스로 보내질 것인지 결정을 하게 된다. 이런 마이크로서비스들은 보통 컨테이너가상화를 통해서 구성이 되어 있다. 그리고 다양한 Runtime Platform을 제공한다. 자바 스프링이던 ..

개인공부 2022.09.19