본문 바로가기
반응형

IT 개인 공부95

[Java] 컬렉션 팩토리 : of Java에서 소수의 데이터를 가지는 고정된 크기의 리스트를 선언하려면 어떻게 해야 할까? 예를 들어 1, 2, 3 정수형 데이터를 가지는 리스트를 선언할 경우 다음과 같이 리스트 객체를 선언 후 add() 메서드를 통해 정수형 데이터를 입력해줄 것이다. List list = new ArrayList(); list.add(1); list.add(2); list.add(3); 하지만 이 방법은 데이터마다 add() 메서드를 타이핑해야 하는 번거로움이 존재하며 선언된 리스트는 고정된 크기의 리스트가 아니다. 이는 Arrays.asList() 팩토리 메서드를 이용하면 코드를 더욱 간단하게 줄일 수 있으며 고정된 크기의 리스트가 보장된다. List list = Arrays.asList(1, 2, 3); 실제로 l.. 2021. 9. 26.
[Spring] Bean Validation 특정 필드에 대해 검증해야 할 경우가 발생할 수 있다. 예를 들어 회원가입 기능을 구현한다고 해보자. 이름(String)과 나이(Integer)는 값이 무조건 입력되어야 하는 필수요소라고 하자. 클라이언트의 실수로 값을 입력하지 않는 경우, 범위를 벗어나거나는 경우, 나이에 Integer가 아닌 String 타입의 값을 입력하는 경우 등 잘못된 상황이 발생할 수 있다. 이때 우리는 검증을 통해 클라이언트에게 잘못된 값을 입력하였다는 것을 알려줄 수 있어야 한다. 그래야 클라이언트는 올바른 값을 입력할 것이기 때문이다. 이는 BindingResult를 활용하면 해결할 수 있다. 하지만 FieldError나 ObjectError를 통해 매번 코드로 검증 기능을 작성하는 일은 상당히 번거로울 수 있다. 특히 .. 2021. 9. 23.
[Spring] @PostConstruct에서 @Transactional 처리 시 문제점 간단한 웹 프로젝트를 진행하고 있는데 테스트할 때마다 매번 DB에 데이터들을 추가해줘야 하는 번거로움이 존재하였다. 이를 해결하기 위해 TestData이라는 클래스를 스프링 빈으로 등록한 후 init() 메서드에 @PostConstruct를 적용하여 TestData 빈이 스프링 컨테이너에 등록될 때 자동으로 테스트 데이터를 DB에 추가하도록 하였다. Member, MemberService, MemberRepository 클래스는 다음과 같이 구현되어 있다. MemberService에는 @Transactional을 걸어주었고, MemberRepository에는 @Transactional을 걸어주지 않았다. @Getter @Setter @Entity public class Member { @Id @Gener.. 2021. 9. 17.
[Spring] 양방향 매핑시 주의점 : toString 이름과 나이를 멤버 변수로 가지는 Member라는 클래스가 있다고 하자. public class Member { private String name; private int age; //Getter & Setter } Member의 정보를 눈으로 확인하고 싶은 경우 다음과 같은 방식을 사용할 것이다. System.out.println("Member [name=" + member.getName() + "] [age=" + member.getAge() + "]"); 하지만 이 방법은 매번 코드를 작성해야 하는 번거로움이 존재한다. 이는 toString() 메서드를 재정의하여 재사용하는 방식으로 해결해줄 수 있다. @Override public String toString() { return "Member{" .. 2021. 9. 15.
[Spring] AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까? Spring AOP를 공부하던 도중 "AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까?"라는 의문을 가지게 되었다. 이를 알아보기 위해 코드를 작성하고 여러 가지 테스트를 실행해보자. 먼저 어노테이션 기반의 단순한 @TestExecution을 선언하자. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestExecution { } @Aspect @Component public class TestAspect { @Around("@annotation(TestExecution)") public Object logExecutionTime(ProceedingJoinP.. 2021. 9. 11.
[Spring] AOP란? 스프링 프레임워크에는 스프링 트라이앵글이라는 것이 존재한다. 이는 스프링 프레임워크의 핵심 요소를 나타내는 것인데 이 중 하나인 AOP에 대해서 알아보도록 하자. AOP는 Aspect-Oriented Programming의 약자로써 그대로 번역하면 관점-지향 프로그래밍을 의미한다. 그렇다면 관점이라는 것이 무엇을 의미하는 것일까? 이는 말보다 그림으로 이해하는 것이 편하다. A, B, C의 클래스가 존재한다고 해보자. 각 클래스는 특정 로직을 수행하는 메서드를 하나씩 가진다. 그런데 성능 측정을 위해서 메서드가 수행되는 시간을 측정해야 하는 요구사항이 들어왔다고 생각해보자. 가장 단순한 방법은 A, B, C 클래스에 시간 측정 로직을 모두 넣는 방법일 것이다. 근데 이 방법은 상당히 비효율적이다. 매번 .. 2021. 9. 9.
[Spring] 서블릿 필터 vs 스프링 인터셉터 권한이 있는 사용자만 특정 URI에 접속할 수 있어야 하는 경우가 발생할 수 있다. 예를 들어 로그인된 사용자만 게시판에 글을 작성할 수 있다면, 로그인되지 않은 사용자는 게시판 작성 URI에 접속해서는 안된다. 즉, URI마다 특정 조건을 걸어서 권한이 없는 사용자를 필터링할 수 있어야 하는데 이는 서블릿 필터 or 스프링 인터셉터를 활용하면 해결할 수 있다. 공통 관심사로 분류할 수 있기 때문에 AOP를 활용해도 되지만 웹과 관련된 공통 관심사는 HTTP 헤더나 URI 정보들이 필요하기 때문에 HttpServletRequest를 제공하는 이들을 사용하는 것이 좋다. 서블릿 필터 서블릿 필터는 서블릿에서 지원하는 기능으로 서블릿 이전에 필터가 적용된다. 따라서 필터에서 적절하지 않은 요청이라 판단되면 .. 2021. 9. 5.
[Spring] HTTP 메시지 컨버터 클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음과 같은 방법을 통해 전달한다. GET + 쿼리 파라미터 POST - HTML Form HTTP Message Body 반대로 서버에서 클라이언트에 응답 데이터를 전달할 때는 다음과 같다. 정적/동적 HTML HTTP Message Body HTTP API를 제공하는 경우에는 HTTP Message Body에 JSON, XML, TEXT 형식으로 데이터를 직접 담아서 요청 및 응답을 처리한다. Spring에서는 HttpEntity 객체나 @RequestBody, @ResponseBody 어노테이션을 사용하면 데이터를 직접 매핑할 필요 없이 자동으로 요청 및 응답 데이터를 적절한 데이터 형식으로 변환해준다. @Slf4j @Controller @Req.. 2021. 9. 3.
HTTP 프로토콜 발전 대부분의 인터넷은 HTTP 프로토콜을 기반으로 통신한다. HTTP 프로토콜은 Hypertext Transfer Protocol의 약자로 TCP/IP 위에서 작동하는 인터넷상에서 데이터를 주고받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다. HTTP는 1965년부터 등장하여 부족한 성능을 개선해나가면서 현재 HTTP 3.0 버전까지 등장하였다. Naver, Google 등 다양한 웹사이트를 접속하면 여러 버전의 HTTP를 사용 중인 것을 확인할 수 있다. HTTP는 TCP/IP 계층의 Application 계층에서 동작한다. 또한 Application 계층의 프로토콜들은 추가적인 기능을 제공하기 위해 Transport 계층의 TCP or UDP 프로토콜을 활용한다. 기본적으로 HTTP는 연결 지향적이.. 2021. 9. 2.
반응형