post-thumbnail

22. AOP 적용

AOP Aspect Oriented Programming 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리 TimeTraceAop.java 시간 측정 AOP 등록 👍🏻 해결 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다. 핵심 관심 사항을 깔끔하게 유지할 수 있다. 변경이 필요하면 해당 로직만 변경하면 된다. 원하는 적용 대상을 선택할 수 있다. 스프링의 AOP 동작 방식 AOP 적용 전 의존관계 ![](https://velog.velcdn.com/images/dydq

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

21. AOP

AOP가 필요한 상황 모든 메소드의 호출 시간을 측정하고 싶다면? 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면? MemberService.java MemberService 회원 조회 시간 측정 추가 실행결과 join findMembers ![](https://velog.velcdn.com/images/dydqja4582/post/ecc839bc-b98a-4652

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

19. JPA

JPA란? JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다. JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다. JPA를 사용하면 개발 생산성을 크게 높일 수 있다. build.gradle build.gradle 파일에 JPA, h2 데이터 베이스 관련 라이브러리 추가를 위해 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 다음 코드를 작성해준다. spring-boot-starter-data-jpa는 내부에 jdbc 관련 라이브러리를 포함하고 있기에 jdbc는 제거해도 무관하다. Application.properties 스프링 부트에 JPA 설정 추가 show-sql : JPA가 생성하는 SQL을 출력한다. ddl-auto : JPA는 테이

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

18. 스프링 JdbcTemplate

이번에는 스프링과 DB 연결을 JdbcTemplate을 통해 구현한다. JdbcTemplate 연결을 위한 새로운 리포지토리를 만들어준다. JdbcTemplateMemberRepository.java JdbcTemplate 사용을 위해 객체를 생성하고 생성자를 통해서 dataSource를 부여받도록한다. @Autowired는 생성자에 클래스가 하나라면 생략이 가능하다. 간단하게 코드를 한줄씩 확인해보면 memberRowMapper() RowMapper는 리턴값을 객체로 리턴될 수 있도록 하는 기능을 한다. Save() save는 JdbcTemplate에서 제공하는 JdbcInsert를 활용한다. 쿼리를 직접 작성해줄 필요 없이 insert 대상 테이블과, 컬럼, 그리고 값을 받아 insert를 해주는 기능을 하고 있다. findById() jdbcTemplate에 직접 쿼리를 작성해서 해당 파라미터 값으

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

17. Spring 통합 테스트

Memory에 데이터를 넣어서 테스트 했을 때와 달리 데이터베이스를 연결해 사용할 때는 Spring 통합 테스트로 진행해야한다. MemberServiceIntegrationTest.java @SpringBootTest : 스프링 컨테이너와 테스트를 함께 진행한다. @Transactional : 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다. 💡 즉, 테스트를 하나의 트랜잭션으로 묶고 테스트가 끝나면 다시 롤백을 해주기 때문에 테스트로 발생한 데이터베이스 커밋을 지워주지 않아도 되는 간편함이 있다. 해당 어노테이션을 통해 반복적인 테스트 수행이 가능하게 된다. 실행 결과 ![](https://velog.velcdn.com/images/dydqja4582/post/7e1c3d33-9

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

16. 순수 JDBC

지난번 설치한 H2 데이터베이스를 순수 JDBC를 활용해서 프로젝트에 연결해 볼 것이다. 환경 설정 build.gradle build.gradle 파일에 JDBC, H2 데이터베이스 관련 라이브러리를 추가해준다. application.properties 스프링 부트 데이터베이스 연결 설정 추가를 위해 properties 파일에 데이터베이스 url, driver-class-name을 작성해준다. 💡 스프링부트 2.4부터는 spring.datasource.username = sa 를 꼭 추가해주어야 한다. 그렇지 않으면 Wrong user name or password 오류가 발생한다. JDBC 리포지토리 구현 JDBC를 위한 리포지토리를 작성해준다. JdbcMemberRepository.java 먼저 DataSource라는 것을 주입받는 것을 확인할 수 있는데 DataSour

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

15. H2 데이터베이스 설치

지금까지는 메모리에 저장을 해서 새로고침을 하거나 다시시작을 하게 된다면 지금까지의 데이터가 싹 날아갔다. 이러한 문제를 해결하기 위해 H2 데이터베이스를 설치해서 활용해 볼 것이다. H2 데이터베이스 해당 url에서 자신의 환경에 맞게 다운로드를 진행해준다. H2 데이터베이스 접속 윈도우는 다른 작업 없이 그대로 접속하면 된다고 하지만 Mac os의 경우 해당 파일에서 접속 가능하도록 권한을 변경해줘야한다. chmod 755 h2.sh ./h2.sh 를 터미널에서 순서대로 입력해준다. H2 데이터베이스 실행 ![](https://velog.velcdn.com/images/dydqja4582/post/c7cb13f7-d962-46b

2023년 4월 29일
·
0개의 댓글
·
post-thumbnail

14. 회원 웹 기능 - 조회

등록 후 회원 조회를 할 수 있는 페이지와 컨트롤러를 만들어준다. MemberController.java 전에 만들어 놓았던 MemberController에 회원 조회를 위한 컨트롤러를 만들어준다. memberService에 findMembers() 메소드를 통해서 등록된 회원의 정보를 가져온다. 해당 정보를 model을 통해서 템플릿에서 사용할 수 있도록 한다. return은 조회를 위한 html로 향할 수 있도록 한다. memberList.html 여기서 템플릿 엔진의 기능을 통해서 members로 전달된 리스트의 크기만큼 tr을 만들어 줄 수 있다. 실행 결과 작성한 두개의 이름이 다음과 같이 출력되게 된다.

2023년 4월 28일
·
0개의 댓글
·
post-thumbnail

13. 회원 웹 기능 기능 - 등록

등록을 위한 html 페이지와 컨트롤러를 작성해준다. MemberController.java 클라이언트가 회원가입을 눌렀을 때 회원등록 페이지로 이동할 수 있도록 이전에 생성해놓았던 MemberController에 코드를 추가해준다. GET 방식으로 /members/new가 들어왔을 때 createFrom() 메소드가 실행되고 createMemberForm.html 이 브라우저로 전달된다. createMemberForm.html createMemberForm은 form을 통해 클라이언트가 작성한 데이터를 POST 방식으로 보내게된다. MemberForm.java 회원 이름을 전달 받을 폼 객체를 생성해준다. POST 방식으로 보낸 form 데이터를 처리할 수 있도록 MemberController쪽에 POSTMappig으로 코드를 작성해준다. POST 방식으로 넘어온 요청 파라미터 이름 name으로 MemberForm

2023년 4월 28일
·
0개의 댓글
·
post-thumbnail

12. 회원 웹 기능 - 홈 화면 추가

간단하게 홈 화면을 추가하는 작업을 진행할 것이다. 사용자가 처음 웹에 들어오면 보여줘야하는 페이지를 위해서 컨트롤러와 화면 페이지를 만들어준다. HomeController.java Home.html 실행결과 왜 index.html 아닌 home.html을 보여주지? 그런데 처음에 만들어 주었던 index.html이 나오는게 아니라 이번에 만든 home.html이 출력되는 이유는 스프링 부트가 먼저 관련 컨트롤러를 찾기 때문이다. 처음에는 관련 컨트롤러가 없어서 스프링 부트가

2023년 4월 28일
·
0개의 댓글
·
post-thumbnail

11. 자바 코드로 직접 스프링 빈 등록하기

어노테이션을 활용하여 스프링 빈을 등록할 수도 있지만 자바 코드로 직접 스프링 빈을 등록할 수도 있다. 회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 어노테이션을 제거하고 진행한다. hello > hellospring > SpringConfig 파일을 하나 생성해준다 . SpringConfig.java 스프링은 @Configuration을 보고 @Bean을 스프링 빈에 등록해준다. > 참고 XML으로 설정하는 방식도 있지만 최근에는 잘 사용하지 않으므로 생략함 DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방식이 있다. 의존관계가 실행 중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입 방식을 권장

2023년 4월 28일
·
0개의 댓글
·
post-thumbnail

10. 컴포넌트 스캔과 자동 의존관계 설정

도메인, 리포지토리, 서비스는 개발을 완료했고 이제 view와 연결을 위한 컨트롤러가 필요하다. > > > 컨트롤러에서는 서비스의 기능이 필요하게 되는데 이 관계를 의존관계라고 한다. > > 회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비한다. > MemberController @Controller 컨트롤러를 스프링 빈으로 등록하기 위해 사용한다. @Autowired 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection), 의존성 주입이라고 한다. 이전 테스트에서는 개발자가 직접 주입했고(new), 여기서는 @Autowire에 의해 스프링이 주입해준다. @Autowired를 통한 DI는 helloController, memberSerivce와 같이 스프링이 관

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

9. 회원 서비스 테스트

먼저 원하는 Service 클래스의 테스트 클래스를 만들어준다. 전에는 테스트 클래스를 직접 작성했지만 인텔리제이에서는 단축키를 제공한다. 를 누르면 테스트 클래스를 자동으로 작성해준다. MemberServiceTest.java given, when, then 패턴 given-when-then 패턴은 test code 작성 시 자주 사용하는 패턴이다. 어떤 상황이 주어져서(given), 이것을 실행 했을 때(when), 어떤 결과가 나와야한다(then)의 구조를 가지고 있다. Given 테스트를 위해 준비하는 과정 테스트에서 사용되는 변수, 입력 값들을 정의하거나, Mock 객체를 정의하는 부분 When 실제로 테스트를 실행하는 과정 하나의 메서드만 수행하는 것이 바람직하며 대체로 가장 중요하지만 가장 짧은 과정이다. Then When에서 실행한 결과를 검증하는 과정

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

8. 회원 서비스 개발

service 패키지를 새로 만들어주고 MemberSerive 클래스를 구현해준다. MemberService Join 메소드 회원 가입을 위해서 join 메소드를 만들어주었다. 중복 회원이 있을 경우 회원가입이 불가하도록 로직을 만들어야한다. 강의에서는 해당 기능을 새로운 메소드로 만들었다. 기존의 코드에서는 if문을 써서 null이 아닐 경우 이미 존재하는 회원이라고 안내할 수 있었지만 findByname에서 return 할 때 Optinal 타입으로 한번 더 감싸서 return 시키기에 ifPresent와 IllegalStateException 등을 사용할 수 있다. 보다 더 간편하고 효율적으로 코드를 작성할 수 있게 되었다. 전체 회원 조회는 이미 repository에서 기능을 만들어놓았기에 호출해서 사용했다.

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

7. 회원 리포지토리 테스트 케이스 작성

MemoryMemberRepositoryTest.java 테스트 파일은 외부에서 사용하지 않는 파일이라 public을 제거해주었다. save() save()의 테스트 코드 직접 결과를 System.out.println(); 으로 확인해봐도 되지만 Assertions를 통해서 확인할 수도 있다. assertThat(예상 값, 실제 값) == assertThat(실제 값).isEqualTo(예상 값) 이제 나머지 findByName(), findAll() 등도 테스트를 진행해준다. 테스트 클래스

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

6. 회원 도메인과 리포지토리 만들기

1) 웹 애플리케이션 계층 구조 컨트롤러 : 웹 MVC의 컨트롤러 역할 서비스 : 핵심 비즈니스 로직 리포지토리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리 도메인 : 비즈니스 도메인 객체 (회원, 주문 등 주로 DB에 저장하고 관리됨) Member.java DB에 이러한 필드가 있을 것이라고 알려준다. MemberRepository.java Optional : Java 8에 들어간 기능 → null로 반환할때 Optional이란 걸로 감싸서 반환하는 것을 선호 DB를 바꿀 수도 있기에 인터페이스로 작성한다. Optional은 Null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(NullPointException

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

5. 스프링 웹 개발 기초

1. 정적 컨텐츠 → 파일 그대로를 사용자 혹은 클라이언트에게 제공하는 것 스프링 부트 정적 컨텐츠 제공 기능 스프링 부트에서는 정적 컨텐츠를 제공하는 기능이 있는데 resource/static/파일명.html 을 만든다면 localhost:8080/파일명.html로 접근할 경우 정적 컨텐츠를 바로 제공해준다. 정적 컨텐츠 제공 기능 프로세스 먼저 웹 브라우저는 스프링 부트에 /파일명.html로 요청을 한다. 스프링 컨테이너는 파일명.html의 컨테이너를 찾는다. 만약 관련 컨트롤러가 없다면 resources/static 하위에 있는 정적 컨텐츠를 그대로 웹 브라우저에 반환을 한다.

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

4. 빌드하고 실행하기

terminal로 이동 프로젝트 파일이 있는 위치로 이동 ./gradlew build cd build/libs java -jar hello-spring-0.0.1-SNAPSHOT.jar 실행확인 이렇게 터미널로 하는 방법도 있지만 인텔리제이에서 제공하는 기능이 훨씬 편하기에 인텔리제이에서 제공하는 기능으로 자주 사용한다.

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

3. View 환경설정

스프링 부트 동작 Welcome Page 만들기 스프링부트가 제공하는 Welcome Page 기능 스프링 부트는 웹 개발을 위한 여러 기능들을 제공하는데 그 중 하나는 Welcome Page 기능을 제공한다는 것이다. ‘static/index.html’ 을 만들어두면 Welcome Page 기능을 제공한다. 컨트롤러 클라이언트는 컨트롤러를 가장 먼저 접하게 되는데 컨트롤러는 다음과 같다. 1) 컨트롤러 사용을 위해 “@Controller” 어노테이션을 작성해주어야 한다. 2) “@GetMapping”은 http Method인 GET과 매핑 될 수 있도록 하는 어노테이션이다 “/hello”로 들어오게 되면 하위에 있는 메소드가 실행된다. 3

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

2. 라이브러리

Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다. 스프링 부트 라이브러리 1) Spring-boot-starter-web spring-boot-starter-tomcat : 톰캣(웹서버) spring-webmvc : 스프링 웹 MVC 2) spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(view) 3) spring-boot-starter(공통) : 스프링부트 + 스프링 코어 + 로깅 spring-boot spring-core spring-boot-starter-logging logback, slf4j 테스트 라이브러리 1) Spring-boot-starter-test junit : 테스트 프레임워크 mockito : 목 라이브러리 assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리 spring-test : 스프링 통합 테스트 지원

2023년 4월 27일
·
0개의 댓글
·