Spring
[Spring Basic] 스프링과 IoC
[Spring Basic] 스프링과 IoC
2022.08.06AppConfig를 도입해 제어의 흐름을 가져왔다. 각각의 서비스들은 필요한 인터페이스를 호출하지만, 어떤 구현 객체들이 호출되는지는 모른다. 프레임워크와 라이브러리도 제어의 대상에 따라 구분할 수 있다. 프레임워크가 내가 작성한 코드를 제어하고 대신 실행하면 프레임워크라고 부르고, 반대로 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리라고 부른다. 프레임워크의 대표적인 예시로는 JUnit테스트가 있다. 정적인 클래스 의존 관계와 실행 시점에 결정되는 동적인 객체 의존 관계로 나눌 수 있다. 정적인 클래스 의존관계는 클래스에서 import하는 요소들만 보고 의존관계를 판단하는걸 의미한다. OrderServiceImpl은 MemberRepository와 DiscountPolicy에 의존함을 알..
[Spring Basic] JPA와 AOP
[Spring Basic] JPA와 AOP
2022.07.29JDBC나 JPA로 스프링과 데이터베이스를 연결한 후, 테스트를 진행해보자. @SpringBootTest @Transactional class MemberServiceIntTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("hello"); //When Long saveId = memberService.join(member); //Then Member findMember = memberRepository.findById(..
[Spring Basic] 동기와 비동기
[Spring Basic] 동기와 비동기
2022.07.15데이터를 주고받을 때 XML을 자주 사용했는데, XML은 사용하기 복잡하고 태그를 많이 사용해야 해서 XML보다 간단하게 사용할 수 있는 JSON 형식을 사용한다. JavaScript객체를 서버로 전송하려면 데이터를 전송하기 편한 형식으로 먼저 변환하는 직렬화 과정이 필요하고, 서버가 보낸 데이터를 JavaScript 객체로 변환할 때는 역직렬화가 수행된다. 자바와 자바스크립트간의 데이터 교환을 수행하려면 Jackson, stringify, parse 등 라이브러리와 내장 메서드를 사용해 직렬화와 역직렬화를 수행한다. 동기 방식은 작업을 순차적으로 처리하는 방식이고, 비동기 방식은 여러 작업을 동시에 처리하는 방식이다. 동기 방식은 한 번에 하나의 작업만 처리할 수 있다. 특정 작업이 수행중일 경우 다음..
[Spring Basic] MyBatis
[Spring Basic] MyBatis
2022.07.12MyBatis는 자바 코드와 SQL을 매핑해주는 프레임워크다. SQL문을 별도의 xml파일로 분리해 자바 코드에서 SQL을 직접 작성하지 않고 간편하게 작성할 수 있게 도와준다. MyBatis가 JDBC드라이버를 사용해 DB와 통신하고, Spring을 사용할 때는 MyBatis와 Spring을 연결해주는 mybatis-spring을 설치해 사용한다. MyBatis를 사용하기 전에는 SQL 구문을 자바의 String 객체에 직접 저장하고 SQL을 데이터베이스에 보내는 방식으로 데이터베이스와 통신했었지만, MyBatis가 도입된 이후부터는 xml에 SQL을 작성해 데이터베이스와 통신한다. MyBatis에서 SqlSession을 생성하려면 SqlSessionFactory 의 구현체가 필요하다. SqlSessi..
[Spring Basic] DAO Repository DTO VO Entity
[Spring Basic] DAO Repository DTO VO Entity
2022.07.09DAO, Repository 데이터에 접근하기 위한 객체를 DAO (Data Access Object) 라고 한다. DAO를 사용해 데이터베이스에 있는 테이블로부터 CRUD를 수행한다. 데이터베이스 테이블 하나당 하나의 DAO를 작성하고, Controller에서 DAO를 통해 데이터베이스를 다룬다. 컨트롤러에서 바로 데이터베이스에 접근하도록 할 수도 있지만, 이 경우 중복되는 메서드들이 많이 발생할 수 있다. 중복되는 내용을 DAO로 따로 정리해놓고, 컨트롤러가 DAO를 통해 데이터베이스에 접근하도록 하는 편이 합리적이다. 이를 계층의 분리라고 부르고 DAO는 Persistence Layer, 컨트롤러를 Presentation Layer라고 부른다. DAO 계층에서 데이터베이스 연결, 쿼리 실행, 등 데..
[Spring Basic] JUnit Test Framework
[Spring Basic] JUnit Test Framework
2022.07.09개발 방법론 중 TDD (Test-Driven Development) 는 애플리케이션에 기능을 추가하기 전에 기능이 작동하는 테스트케이스를 먼저 작성하고 테스트를 통과하는 소스코드를 작성하는 방식의 개발 방법을 의미한다. 테스트를 먼저 추가하는 방식으로 개발해 견고한 코드를 작성할 수 있고 이후 추가로 기능을 개발했을 때 이미 작성한 테스트를 실행시켜 새로 개발한 기능에 Side Effect가 없는지 검증할 수 있다. JUnit은 자바로 작성한 애플리케이션을 작은 단위로 나눠서 테스트 할 수 있게 해 주는 도구이다. 간단한 테스트는 자바로 비즈니스 로직 작성하듯 테스트 할 수 있지만 테스트 할 때 데이터베이스를 연동하고 여러 가지 무거운 객체들을 DI 받아야 하는 경우는 테스트를 가볍게 돌리기 위해 Mo..
[Spring Basic] 파라미터의 변환과 검증
[Spring Basic] 파라미터의 변환과 검증
2022.06.24위의 URL로 요청을 수행하면, 데이터는 Map 자료구조로 변환된다. 해당 Map을 컨트롤러가 파라미터에 있는 MyDate 객체로 묶어준다. 이 과정에서 WebDataBinder가 개입해 타입 변환과 데이터 검증 작업을 수행한다. WebDataBinder는 스프링 MVC가 제공하는 기능으로, HTTP 요청 파라미터를 자바 객체에 자동으로 바인딩하는 역할을 수행한다. WebDataBinder가 요청 파라미터를 자바 객체로 변환할 때는 내부적으로 PropertyEditor 또는 Converter 가 사용된다. PropertyEditor는 java.beans 패키지에 포함돼있고 문자열을 특정 타입의 객체로 변환하거나 객체를 문자열로 변환한다. Converter는 스프링에서 제공하는 인터페이스로 문자열을 객체로..
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23스프링 MVC의 디스패처 서블릿은 여러 개의 서블릿들에 대해 공통 부분을 따로 빼서 처리하는 역할을 수행한다. (프론트 컨트롤러) 클라이언트로부터 요청이 오면 우선 디스패처 서블릿이 요청을 받아 해당하는 컨트롤러의 메서드를 호출한 후 컨트롤러가 반환하는 뷰 이름을 받아오는 방식으로 진행된다. 이 과정에서 URL을 키, 메서드를 값으로 가지는 HandlerMapping과 HandlerAdapter가 사용된다. HandlerMapping은 디스패처 서블릿이 클라이언트로부터 받은 요청을 어떤 컨트롤러가 처리할 지 결정한다. HandlerAdapter는 HandlerMapping이 찾은 컨트롤러를 실행하고 그 결과를 적당한 객체로 변환한다. 요청이 왔을 때 디스패처 서블릿은 HandlerMapping에게 먼저 ..
[Spring Basic] 리다이렉트와 포워드
[Spring Basic] 리다이렉트와 포워드
2022.05.12Redirect 클라이언트가 요청을 했지만, 요청을 처리하는 jsp파일에서 요청을 처리할 수 없을 때 다른 URL으로 다시 요청한다. 브라우저는 자동으로 Redirection의 헤더에 담긴 정보를 읽고 요청을 보낸다. 처음 요청은 수동, 두 번째 요청은 자동으로 수행되고 리다이렉트로 요청될 때는 처음 요청이 어떤 방식임에 상관없이 GET방식으로 요청한다. 즉, 클라이언트가 요청을 보내고 서버는 클라이언트에게 새로운 위치로 이동하라고 응답하는 경우가 리다이렉트이다. (HTTP 300번) 원래의 요청과 새로운 요청은 독립적으로 구분된다. 사용자가 로그인 후 메인 페이지로 이동하는 경우 사용된다. Forward 클라이언트가 요청을 했지만 해당 jsp에서 전부 처리하지 못하고 다른 jsp를 호출하는 경우를 말한..
[Spring Basic] 서블릿과 JSP
[Spring Basic] 서블릿과 JSP
2022.05.05클라이언트가 정적 리소스를 요청하는 경우 웹 서버가 바로 처리할 수 있다. 클라이언트가 동적 리소스를 요청하는 경우는 웹 서버만으로 처리하기 힘들다. 웹 서버는 WAS에게 클라이언트의 요청을 넘기고 WAS의 처리 결과를 클라이언트에게 반환한다. (WAS는 웹 서버 역할을 수행할 수 있기도 하다) WAS가 클라이언트의 동적 리소스 요청을 처리할 때 서블릿이 사용된다. 서블릿이 도입되기 전에는 CGI 방식으로 사용자의 요청을 처리했다. CGI는 클라이언트의 요청이 들어올 때 마다 새로운 프로세스를 생성하는 방식으로 동작하고, 동시에 많은 요청이 들어오는 경우 프로세스의 생성과 종료에 따른 오버헤드가 너무 크다는 단점이 있다. 이런 단점을 극복하기 위해 서블릿이 도입됐다. 서블릿은 WAS가 한 번 실행되면 메..
[Spring Basic] 서블릿과 출력
[Spring Basic] 서블릿과 출력
2022.04.13보통 자바의 main메서드 옆에는 String[] args가 붙어있는 경우가 많다. 여기서 args가 의미하는 바는 cmd에서 자바 인터프리터로 프로그램을 실행할 때 추가되는 문자열을 담기 위한 배열이다. (프로그램이 사용자로부터 입력을 받거나 다른 프로그램과 데이터를 주고받을 때 사용된다) java Main.java arg1 arg2 arg3 이런 식으로 프로그램을 실행하면 arg1은 arg[0] 에, arg2는 arg[1] 에.. 이런 방식으로 args 배열이 설정된다. 마찬가지로, 브라우저에서 URL을 통해 호출을 진행하면 Tomcat이 HttpServletRequest객체를 만들고 요청한 정보를 담은 후 main메서드의 매개변수로 넘겨준다. public void main(HttpServletReq..
[Spring Basic] Java Reflection API
[Spring Basic] Java Reflection API
2022.04.13import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Hello World"); } } 위와 같은 소스코드 파일이 주어졌을 때, cmd에서 실행시키려면 해당 파일이 위치한 위치에서 java Main.java 를 입력하면 된다. 여기서 앞에 위치한 java는 java.exe로 자바 인터프리터를 의미하며, 인터프리터가 Main.java의 main메서드를 호출해 소스코드가 실행된다. (mai..