스프링강의 66

JDK동적 프록시

@Test void dynamicA() { AInterface target = new AImpl(); TimeInvocationHandler handler = new TimeInvocationHandler(target); // 프록시를 호출하는 로직 // jdk에서 지원하는 프록시 생성기술(newProxyInstance를 하면 동적으로 생성된다.) 파라미터를 살펴보면. 1.프록시가 어디에 생성될지 지정 2.어떤 기반의 프록시를 만들지 지정 3.프록시가 사용할 로직 // 클래스로더를 지정해주는 이유는 자바는 클래스가 호출되면 클레스로더에 올라가게 되는데 그 위치를 지정해주기 위함이다. AInterface proxy = (AInterface) Proxy.newProxyInstance(AInterface.cl..

스프링강의 2023.06.20

html엔티티

@GetMapping("text-unescaped") public String textUnescaped(Model model) { model.addAttribute("data", "Hello Spring!"); return "basic/text-unescaped"; } HTML 테그의 속성이 아니라 HTML 콘텐츠 영역안에서 직접 데이터를 출력하고 싶으면 다음과 같이 [[...]] 를 사용하면 된다. th:text 사용 컨텐츠 안에서 직접 출력하기 = [[${data}]] 결과: th:text 사용Hello Spring! 컨텐츠 안에서 직접 출력하기 = Hello Spring! 설명: 첫번째 li태그 소스 보듯이 html태그 안에서 사용하는방법과 두번째 li태그 처럼 태그 밖에서..

스프링강의 2022.06.24

getParameterNames와 getParameterValues

final Enumeration e = request.getParameterNames(); while (e.hasMoreElements()) { // 가져온 파라미터 이름들을 루프를 돌려서 전부 뽑아낸다. final String paramName = e.nextElement(); // 파라미터 이름들을 하나씩 담는다. System.out.println("name = " + paramName); // 파라미터 이름이 출력된다. final String parameter = request.getParameter(paramName); // 파라미터에 루프를 돌린 이름들을 넣고 value를 가져온다. System.out.println("parameter = " + parameter); // 요청 파라미터의 이름이..

스프링강의 2022.06.20

생성자 주입의 장점

1. 불변 - 대부분의 의존관계 주입은 한번 일어나면 애플리케이션이 종료 될때까지 변경할 일이 없다. 그리고 변경 되어서도 안된다. 생성자 주입은 객체를 생성할때 딱 1번만 호출되므로 이후에 호출될 일이 없다 그래서 불변하게 설계가 가능하다. 하지만 수정자 주입을 사용하면 setXxx메서드로 열어 놔야하기 때문에 누군가로 인해 변경이 일어날 수 있기 때문에 좋은 설계 방식이 이다. 2. 누락 - 테스트 코드를 작성시 객체를 생성해서 테스트를 할때 생성자 주입이면 필요한 파라미터를 명시적으로 알 수 있고 넣지 않으면 컴파일 오류가 발생하기 때문에 깜빡하고 파라미터를 넣지 않고 런타임 에러를 맞을일이 없다. 3. final 키워드 - 생성자 주입은 final 키워드를 사용할 수 있다. 이걸 사용함으로써 생성..

스프링강의 2022.06.12

InputStream

request.getInputStream()을 쓰면 메세지 바디에 있는 내용을 바이트로 코드로 바로 얻을 수 있다. 얻어온 바이트 코드를 String 으로 바꿔주려면 스프링에서 제공하는 StreamUtils 를 쓰면 된다. 예시로 final String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); 이렇게 사용하면 되는데 request.getInputStream()로 얻어온 InputStream을 넣어주고 인코딩에 대한 정보를 넣어준다. 항상 바이트를 문자로 변환할땐 인코딩 정보를 알려줘야한다. 그럼 요청한 메세지 바디가 문자열로 messageBody에 담기게 된다.

스프링강의 2022.05.31

의존관계 주입

생성자 주입에는 생성자 주입, 필드 주입, 수정자 주입(setter 주입), 일반 메서드 주입이 있다. 생성자 주입은 private MemberRepository memberRepository; private DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } 이런식으로 작성을 하는데 생성자 주입의 장점은 주입해주는 것들은 언제든지 바꿀 수 있다는 점이다. 그렇게 되면 OCP..

스프링강의 2022.05.28

프레임워크와 라이브러리의 차이

프레임워크는 내가 작성한 코드를 제어하고 대신 실행해준다(예를 들면 junit) 그리고 프레임워크는 프레임워크만의 라이프사이클 속에서 내 코드가 적절한 시점에 호출되도록 해준다 이런걸 제어의 역전(ioc)이라고 함 제어를 내가 하는게 아니라 프레임워크가 함 반면에 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리이다. 예를들면 자바객체를 json이나 xml로 변경할때 라이브러리들을 불러다가 내가 직접 호출하기때문에 라이브러리.

스프링강의 2022.05.10

로깅 설정

로그 종류로는 trace, info, debug, wran, error 가 있다 private Logger log = LoggerFactory.getLogger(getClass() 아니면 해당 클래스명.class를 넣어준다.); 로그를 찍을수 있게 만들어서 log.trace("trace log={}", name); log.debug("debug log={}", name); log.info("info log={}", name); log.warn("warn log={}". name); log.error("error log={}". name); 이런식으로 자기가 원하는 로그를 찍어볼수 있다. (log에 문자열과 변수를 연결할때 + 아닌 , 를 쓸때 ={}이 중괄호를 써야 값이 들어간다. 안쓰면 값이 안들어가서..

스프링강의 2022.01.13