Book/Spring boot 와 AWS로 혼자 구현하는 웹서비스

    [Book] 18) 스프링 Security와 Oauth2.0으로 로그인 기능 구현하기! -1

    👻 들어가기 앞서.. 스프링 시큐리티는 인증과 인가 기능을 가진 프레임워크입니다. 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 권장한다고 합니다. 확장성을 고려한 프레임워크여서 다양한 요구사항에 쉽게 추가하고 변경할 수 있습니다. 그리고 많은 서비스에서 로그인 기능을 소셜 로그인 기능으로 사용합니다. 왜 소셜 로그인 기능을 사용하나요? 로그인 기능을 직접 구현 하려면 보안, 인증, 찾기, 변경 같은 기능들을 전부 다 구현 해야합니다. 많은 시간 투자와 코드의 복잡성이 늘어나겠죠? 그러나 Oauth 로그인 구현시 로그인 기능을 대신 해주며 서비스 개발에 더욱더 집중 할 수 있도록 합니다. 이번장에서는 구글과 네이버 로그인을 연동하여 로그인 기능을 구현해보겠습니다..

    [Book] 17) 수정 및 삭제 기능을 만들어보자!

    😀 화면 구성해보기! {{>layout/header}} 게시글 수정 글 번호 제목 작성자 내용 {{posts.content}} 취소 수정 완료 삭제 {{>layout/footer}} 😀 Service 클래스에 수정 / 삭제 기능을 추가해보자! 수정 기능은 앞전에 만들어 놓았습니다. @Transactional public Long update(Long id, PostsUpdateRequestDto requestDto) { Posts entity = getEntity(id); entity.update(requestDto.getTitle(), requestDto.getContent()); return entity.getId(); } service 클래스에 삭제 기능을 추가해봅시다! @Transactional ..

    [Book] 16) 전체 조회 화면 및 기능을 만들어보자!

    🥢 전체 조회 화면 구성하기! 아래 코드는 앞전에 만든 index.mustache 파일에 있는 코드입니다. 게시글번호 제목 작성자 최종수정일 {{#posts}} {{id}} {{title}} {{author}} {{modifiedDate}} {{/posts}} 😀 Repository 에 전체 조회 기능 만들기!! PostsRepository 에 기능을 추가해봅시다. @Query("select p from Posts p order by p.id desc") List findAllDesc(); List 타입으로 Posts의 모든 데이터를 내림차순으로 받아옵니다. spring data jpa 의 기능으로 메서드 만으로 위와 같은 기능을 만들 수 있습니다. List** findAllByOrderByIdDesc*..

    [Book] 15) 머스테치로 화면 구성을 해보자! -2

    👻 인덱스 페이지 만들기! {{>layout/header}} Main Page 글 등록 {{#userName}} Logged in as:{{userName}} Logout {{/userName}} {{^userName}} Google Login Naver Login {{/userName}} 게시글번호 제목 작성자 최종수정일 {{#posts}} {{id}} {{title}} {{author}} {{modifiedDate}} {{/posts}} {{>layout/footer}} 👻 레이아웃 분리해보자! footer.mustahce header.mustache 👻 posts-save 페이지를 만들어보자! {{>layout/header}} 게시글 등록 제목 작성자 내용 취소 등록 {{>layout/footer}..

    [Book] 14) 머스테치로 화면 구성을 해보자! -1

    👻 머스테치 플러그인 설치! plugin 설정에 들어가서 handlebars/mustache 를 설치해 줍니다. 👻 머스테치 의존성 추가! build.gradle 파일에 implementation 'org.springframework.boot:spring-boot-starter-mustache' 의존성을 추가해 줍니다. 🕶 index 페이지를 만들어보자!. resources 파일의 templates 안에 index.mustache 파일을 생성해줍니다. 스프링 🕶 index 파일을 제어 하는 Controller 를 만들어야합니다. @Controller public class IndexController{ @GetMapping("/") public String index() { return "index"; ..

    [Book] 13) JPA Auditing으로 생성시간/수정시간 자동화 하기!

    👻 시간 엔티티 만들기! 매번 DB 에 생성시간과 수정시간을 삽입 하고 갱신 하는 것은 번거로운 일 입니다. 자동으로 생성시간과 수정시간을 관리해주는 JPA Auditing 을 사용합니다. 자 그러면 domain 패키지에 BaseTimeEntity 를 생성해봅시다. @Getter @MappedSuperclass // 해당 엔티티를 상속한 엔티티의 속성 값도 엔티티에 적용 @EntityListeners(AuditingEntityListener.class)// Auditing 기능을 적용 public class BaseTimeEntity { @CreatedDate // 엔티티가 생성되어 저장될 때 시간이 자동 저장 private LocalDateTime createdTime; @LastModifiedDate..

    [Book] 12) H2 DB 웹 콘솔에서 직접 접근해보자!

    👻 h2 db 웹 콘솔에서 직접 접근 하기! 지금까지 h2 db를 메모리에서 관리를 하였습니다. 지금은 db를 웹 콘솔에 직접 접근하여 관리를 해보겠습니다. application.properties 파일에 spring.h2.console.enabled=true 을 추가 해줍시다!. http://localhost:8080/h2-console 를 접속합니다. jdbc url 을 jdbc:h2:mem:testdb 으로 지정 해줍니다. 다음으로 concat 버튼을 눌러 접속 해줍니다. 접속한 db에 console 창에 select * from posts; 입력하여 db를 확인합니다.

    [Book] 11) API 만들어보기! -4

    [Book] 11) API 만들어보기! -4

    🕶 업데이트 기능을 만들어 봅시다!. Controller 클래스에 기능 추가해보기! @PutMapping("/api/v1/posts/{id}") -> http put() 사용합니다. public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) { return postsService.update(id, requestDto); } updateRequestDto 클래스를 활용하여 업데이트 할 데이터를 담아서 엔티티에 전달하게 합니다. updateRequestDto 클래스 생성해보기! @Getter @NoArgsConstructor public class PostsUpdateRequestDto{ private St..

    [Book] 10) API 만들어보기! -3

    👻 Repository 에 저장된 값을 조회하는 기능을 만들어보자! controller 클래스에 findById() 기능을 추가해봅시다. @GetMapping("/api/v1/posts/{id}") -> http get() 사용 public PostsResponseDto findById(@PathVariable Long id) { -> uri 에 있는 변수값을 설정 return postsService.findById(id); } 다음으로는 응답을 받아주는 ResponseDto 클래스를 생성해 봅시다. @Getter public class PostsResponseDto { private final Long id; // id private final String title; // 제목 private fina..

    [Book] 9) API 만들어보기! - 2

    👻 저장 API를 만들어 봅시다!. RestController 를 생성하여 save() 라는 기능을 만들어 봅시다. 현재 조립해야 할 클래스들은 PostsService 클래스와 PostsSaveRequestDto 클래스 2가지가 있습니다. 이 2가지도 같이 생성하겠습니다. @RequiredArgsConstructor -> final 필드의 생성자를 만들어줍니다. @RestController -> @ResponseBody + @Controller 인 기능입니다. public class PostsApiController { private final PostsService postsService; @PostMapping("/api/v1/posts") -> http 메서드의 Post 메서드를 사용합니다. pub..

    [Book] 8) API 만들어보기! - 1

    [Book] 8) API 만들어보기! - 1

    👻 들어가기 앞서.. API 를 만들기 전에 총 3개의 클래스들이 필요 합니다. Request 데이터를 받을 Dto API 요청을 받을 Controller 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service Service에서 비지니스 로직을 처리 해야하는 오해가 있는데 Service 클래스는 트랜잭션, 도메인 간 순서 보장의 역할만 합니다. 그럼 비지니스 로직은 누가 처리하나요?? 도메인 클래스에서 비지니스 로직을 처리합니다. 다음 layer 그림을 봅시다. Web Layer 컨트롤러(@Controller) 와 뷰 템플릿 영역 입니다. 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역 입니다. Service ..

    [Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈

    [Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈

    application.properties 파일을 생성하여 아래와 같은 코드를 작성하고 실행을 하였습니다. ## jpa spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 아래 사진과 같은 오류가 나타납니다. 시도 [x] properties 파일을 삭제하고 다시 생성하여 실행 [x] spring.jpa.hibernate.ddl-auto=create 또는 update 구문 추가 implementation 'com.h2database:h2:1.4.199' 버전 수정하여 해결 기존의 스프링 부트 버전이 2.6.5 의 최신 버전이었습니다. 최신 버전이 h2 db 와 호환이 잘..

    [Book] 6) JPA 로 데이터베이스를 다루어보자!

    🕶 들어가기 앞서... 웹 개발을 운영시에 데이터베이스를 다루는 일이 많습니다. 기능 개발을 하여도 데이터베이스와 연동하는 것을 피할 수 없습니다. 자바에서는 객체지향 프로그래밍을 지향하고 있고 데이터베이스는 관계형 데이터베이스를 지향하고 있습니다. 이둘의 차이를 극복하게 해주는 기술이 바로 JPA 라는 자바 표준 ORM 기술입니다. JPA 라는 자바 표준 ORM 은 자바에서의 객체의 멤버들을 데이터베이스와 매핑(Mapping) 을 시켜주어 간단하게 관계를 맷어줄 수 있고 자바와 데이터베이스의 패러다임 불일치 문제, 즉 객체지향 프로그래밍과 관계형 데이터베이스의 관계 불일치 문제점을 해결 해주는 기술입니다. 🕶 JPA를 사용시 좋은점.. 자바 개발을 할 때 객체지향 프로그래밍을 할 수 있게 도와주고 JP..

    [Book] 5) 롬복(Lombok) 을 사용해보자!

    🕶 롬복(Lombok) 의존성을 추가해보자! 롬복을 사용하기전에 의존성을 추가해야합니다. 그러므로 build.gradle 파일에 가서 compileOnly 'org.projectlombok:lombok:1.18.22' 을 추가해 줍니다, 빌드를 실행하고 플러그인에 가서 Lombok 을 설치해 줍니다. 🕶 의존성을 추가해줬다면 롬복기능을 사용해보자! 지금의 프로젝트처럼 작은 규모가 아닌 큰 규모에 프로젝트였다면 롬복으로 전환이 쉽게 됬을 까요?? 쉽지 않았을 겁니다. 매번 코드에 Lombok 기능을 추가하고 코드를 수정하고 반복적인 작업이 될겁니다. 그리고 수정한기능이 제데로 작동하는지 알 수 가 없었을 겁니다. 하지만 지난 시간에 작성한 테스트 코드 로 인해 쉽게 검증을 할 수 있습니다. 이러한 이유로 ..

    [Book] 4) HelloController 생성과 테스트를 해보자!

    👻 메인 클래스를 살펴봅시다. @SpringBootApplication -> 1 public class BoardSpringbootWebserviceApplication{ public static void main(String[]args) { SpringApplication.run(BoardSpringbootWebserviceApplication.class, args); } } @SpringBootApplication 으로 인해 스프링 부트의 자동 설정과 스프링이 관리하는 Bean 읽기와 생성을 모두 자동으로 설정됩니다. 주의 : @SpringBootApplication 이 있는 위치부터 설정을 읽어가기 때문에 이클래스는 항상 프로젝트의 최상단에 위치해야만 합니다. main method 에서 실행하는 S..