※ 읽기 전에 !

 

이번 글은 과제를 하면서 작성한 코드를 이해하고자 내멋대로 주석을 달아본 글이기 때문에, 정답이 아닐 수 있으며 ! 정신 건강을 헤칠수도 있습니다 ^__^

 


 1. HanghaememoApplication

 

@EnableJpaAuditing

  • 스프링 부트의 Entry 포인트인 실행 클래스에 @EnableJpaAuditing 어노테이션을 적용하여 JPA Auditing을 활성화 해준다.
  • 생성일자와 수정일자를 자동으로 등록할 수 있는 기능 외에도 EnableJpaAuditing 에는 다양한 기능이 있다.
  • 이 중 auditorAwareRef 는 @CreatedBy, @LastModifiedBy 과 함께 생성한 사람, 수정한 사람을 자동으로 저장해준다.

 

@SpringBootApplication

  • 스프링 부트의 가장 기본적인 설정을 선언해 주는 어노테이션. 해당 어노테이션을 보면 아래와 같은 어노테이션이 다시 선언되어 있다.
  • @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.
  • @ComponentScan은 @component 어노테이션 및 @Service, @Repository, @Controller 등의 어노테이션을 스캔하여 Bean으로 등록해주는 어노테이션이다.
  • @EnableAutoConfiguration은 사전에 정의한 라이브러리들을  Bean으로 등록해 주는 어노테이션이다. 
    사전에 정의한 라이브러리들 모두가 등록되는 것은 아니고 특정 Condition(조건)이 만족될 경우에 Bean으로 등록한다.

2. Entity ( Memo, Timestamped)

entity 에서 실제 DB의 테이블과 매칭될 객체들을 명시해준다.

 

Entity/Memo

 

@Entity 어노테이션으로 명시한 부분
DB 테이블에 들어갈 항목들
Service에서 사용할 생성자를 명시해준다.

 

Entity/Timestamped

 

 

3. Controller

Client와 Service 를 연결하는 역할이라고 할 수 있다. 이 과정에서 반환값을 Dto에 담았다. (Delete 부분 제외)

 

  • @RestController는 @Controller에 @ResponseBody가 추가된 것. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것
  • @RequiredArgsConstructor : 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 준다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다.

 

  • 내가 이해한 바는, 컨트롤러는 클라이언트와 서비스를 연결해 주는 곳이라는 것.
  • 필요한 작업 (메소드)는 서비스클래스에서 처리가 되기 때문에 컨트롤러에서 클라이언트로 부터 받은 requestDto를 서비스에 전달하면 서비스클래스의 메소드가 필요한 작업을 처리하고, 다시 컨트롤러를 통해 클라이언트로 responseDto 형태의 값을 전달한다고 이해하면 되려나 ( ? ) 

 

4. Dto ( MemoRequestDto, MemoResponseDto )

 

Dto는 약간 포장지에 감싸져있는 데이터인 것 같다. 

클라이언트에서 받은 정보를 바로 DB에 저장하고 그걸 다시 클라이언트 쪽으로 전달하게 된다면, 보안상 위험한 부분이 있을 수 있고 나중에 SQL의 join 기능을 사용할 때 문제가 될 수도 있기 때문에, 필요한 데이터가 안전하게 포장되어 있는 것 이라고 이해했다. 아닐 수도 ^_^

 

MemoRequestDto

 

  • 클라이언트에서 입력을 받아 저장되는 데이터들

 

MemoResponseDto

 

  • 클라이언트 쪽에서 요청이 들어왔을 때 꺼내서 보여지는 데이터들. 
  • password는 빠진 것을 볼 수 있다.

 

5. Service

Service는 컨트롤러에서 받아온 데이터 정보를 잘 가공해 DB와 연결된 Repository에 전달 하기도하고, 다시 DB에서 Repository로 보내준 데이터를 가공하여 컨트롤러쪽으로 보내는 역할을 하는 곳이다. 비지니스 로직을 담당하는 곳이기 때문에 메소드들이 모여있는 곳이기도 하다.

 

  • @Service : 해당 클래스가 비즈니스 로직을 담은 Service 클래스임을 명시합니다. @Component 어노테이션을 사용해도 상관 없지만 @Sevice 어노테이션에 @Component 어노테이션의 기능이 포함되어 있고 @Service를 사용함으로써 해당 클래스가 Service의 역할을 하는 것을 명확하게 알 수 있습니다.
  • @RequiredArgsConstructor : 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다.

 

게시글 POST 메소드 부분

 

  • @Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소
  • 데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다. 이 기능을 하는 어노테이션이 바로 @Transactional

 

 

게시글 전체조회 GET 메소드 부분

 

 

 

게시글 선택 조회 GET 메소드 부분

 

 

 

게시글 수정 PUT 메소드 부분

 

 

 

게시글 삭제 DELETE 메소드 부분

 

 

 

6. Repository

Repository는 Entity에 의해 생성된 DB에 접근하는 메서드를 사용하기위한 interface를 말한다. 저장소와 직접적으로 연결되어 있어 Service에서 필요한 데이터를 DB에서 Entity 클래스로 받아와 다시 Dto로 전달하는 곳이다. 

 

  • 아직 쿼리형식은 공부하지 않았는데, 강의에서 나온대로 쿼리형식으로 지정이 되어있다.
  • 인터페이스란 무엇일까 ? 
  • 인터페이스란 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 컴퓨팅에서 컴퓨터 시스템끼리 정보를 교환하는 공유 경계이다.

 


일단 이번 과제에 작성된 코드를 쭉 한번 살펴봤다. 

 

아직 모르는 개념도 많고 어노테이션도 많고 그 외 이해가 되지 않는 부분이 더 많지만, 대략적인 흐름을 알 수 있었던 것 같다.

개발자마다 순서가 조금씩 다르긴 한데, 보통 entity를 먼저 만들고, 그다음 controller를 만들고, 그다음 Repository, 다음  Service와 Dto를 만드는 것 같다. 기술매니저님이 서비스의 규모가 커질 수록 Dto의 수가 늘어나는 것은 당연한 일이기 때문에, Dto를 만드는 것을 불편해 하지 말라고 하셨다. 이번엔 간단한 프로젝트라 두개의 Dto로 끝나긴 했지만, 앞으로 실전 프로젝트를 위해선 원하는 형식의 Dto를 설계하는 법도 공부해야 할 것 같다. 

PostMan

 

① POST 확인하기 ( 게시글 생성 )

 

 

  • PostMan 어플을 실행한다.
  • 나는 편의를 위해 왼쪽 사이드바 New Collection 부분에 필요한 url을 미리 저장해 놓았다.
  • 위 사진의 순서대로 진행해 준다! 
  • 특히 주의할 점은 [Body] - [raw] - [JSON] 으로 설정해야 한다는 것 ! 

 

② GET 확인하기 ( 게시글 조회 )

 

 

  • 아래 부분에서 POST로 저장된 데이터들을 확인 할 수 있다.

 

 

③ PUT 확인 하기 ( 게시글 수정)

 

 

  • POST와 마찬가지로 중간 Body 부분에서 내용을 수정해서 입력하면 된다.

 

 

④ DELETE 확인하기 ( 게시글 삭제 )

 

 

  • 처음엔 비밀번호를 일부러 틀리게 설정하여 값을 확인해 보았다.
  • Service에서 설정한 대로 return값으로 false 를 반환한다.

 

  • 이번엔 제대로된 비밀번호를 입력해 보았다.
  • 비밀번호가 일치하기때문에 return 값으로 true를 반환하는 것을 확인 할 수 있다.

 

h2- console로  확인하기

  • url에 localhost8080/h2-console 을 입력하면 아래와 같은 화면이 뜬다.
  • JDBC URL은 개인마다 다른데, 인텔리제이에서 파일을 실행시키면 콘솔창에서 확인할 수 있다.

 

이런 화면이 떴다면 일단 시작준비 끝 !

 

① POST/GET 확인하기 ( 게시글 생성 + 조회 )

  • 왼쪽 사이드바에 POST를 클릭한 뒤 Run을 실행시켜 주면 PostMan을 통해 save된 데이터들을 조회할 수 있다.

 

 

② PUT 확인 하기 ( 게시글 수정)

 

  • PostMan을 통해 id넘버 3인 데이터를 수정했는데, 위와 같이 잘 수정된 것을 확인할 수 있다.

 

 

③ DELETE 확인하기 ( 게시글 삭제 )

  • PostMan으로 id3번인 데이터를 삭제하였고, 위와 같이 삭제된 것을 확인할 수 있다.

 


화면단이 없어서 이렇게 PostMan 어플과 h2-console을 이용하여 내가 짠 코드가 제대로 돌아가는지 확인할 수 있는게 너무 훙미로웠다. 

앞으로 자주 사용하게 될 것 같다 : ) 

스프링부트 이용해서 게시판 서버 CRUD 구현하기 !
API 설계 부분

 

Use Case 그려보기

 

 

이렇게 하는게 맞는지 모르겠지만, 일단 https://narup.tistory.com/70 링크를 참조해서 그려본 Use Case

 

 

API 명세서 만들기

 

  • 참고로 RESTful한 API가 되기 위한 규칙이 몇 가지 있는데, (게시글로 정리할 예정)
  • 그 중 URL주소는 복수형 명사로 적는 것이 규칙인 부분이 있다. 
  • 따라서 아래 내가 작성한 URL을 좀 더 RESTful 하게 하려면 '/api/posts'와 같은 형식으로 바꿔주는게 좋다.

 

 

 

과제 구현 순서

① 인텔리제이 설정 

 

 

  • 인텔리제이를 실행한다.
  • New Project 클릭!
  • 왼쪽 사이드바에서 Spring Initializr 선택
  • 프로젝트 이름 설정
  • 경로 설정
  • Language : [Java] 선택
  •  Type : [Gradle-Grooty] 선택
  •  Java version : 17 선택
  • next 클릭

 

 

 

  • 위와 같이 아래 6개 항목을 검색해서 선택해주고, Create 클릭!
  • Spring Web
  • Spring Data JPA
  • H2 Database
  • Thymeleaf
  • Spring Boot DevTools
  • Lombok

※ 참고

 

 

  • https://start.spring.io/ 에서 위와 같은 설정을 할 수도 있다.
  • 항해99 강의는 처음 방법을 사용하였지만, 인프런 김영한 선생님의 강의나 유튜버 홍팍 선생님은 두번째 방법으로 프로젝트 초기 설정을 하셨다.
  • 이 경우 오른쪽 상단의 ADD DEPENDENCIES 를 통해 필요한 것들을 검색하고 세팅할 수 있다.

 

② 패키지 및 클래스 파일 만들기

 

 

 

  • Entity - Controller - Dto -Servie - Repositoy 패키지를 만들어준다.
  • 그리고 그 안에 필요한 클래스와 인터페이스 파일 생성
  • 사실 위에서 Delete 값을 반환 할 ResponseDto 하나를 더 만들면 좋지만 일단 진행하였다.
  • 화면단은 필요 없는 과제이기 때문에 아래 resources 부분의 static과 templates는 비어있는 상태이다.

 

③ Entity - Controller - Dto -Servie - Repositoy 코드 짜기

  • 이 부분은 과제 3 게시글 참조 

 

 PostMan  + h2-console  로 서버가 반환하는 값 확인하기

  • 이 부분은 과제 2 게시글로 참조

 

 

⑤ Github 업로드

 

GitHub - leejincha/hanghaeboard: spring homework

spring homework. Contribute to leejincha/hanghaeboard development by creating an account on GitHub.

github.com

 

[IntelliJ] IntelliJ + Github 연동하기

[IntelliJ] IntelliJ + Github 연동하기 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ IntelliJ 로컬 프로젝트 Github 연동하기 ] 입니다. : ) 인텔리 제이를 통해 개발중인 로컬 프로젝트를 Github이랑 연동하는

goddaehee.tistory.com

 

1. 상속이란 ? 

  • 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 방법.
  • 다시 말해, 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 하는 것.
  • 따라서 중복이 되는 코드를 줄여줄 수 있고, 개발 시간을 절약해 주기 때문에 효율적이고, 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화할 수 있다는 장점이 있다.
  • 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스 또는 파생 클래스라고 부른다.

 

2. 클래스 상속

  • 프로그램에의 상속은 자식이 부모를 선택한다.
  • 선택된 부모클래스는 extends 뒤에 기술한다.
  • 단 하나의 부모클래스만 상속할 수 있다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모 클래스와 자식 클래스의 패키지가 다르다면, default 접근 제한을 갖는 필드와 메소드도 상속대상에서 제외된다.

 

3. 부모 생성자 호출

  • 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
  • 부모 생성자는 자식 생정자의 맨 첫 줄에서 호출된다.
  • super();는 부모의 기본 생성자를 호출한다.
  • 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성한다.

  • super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. - 일치하지 않으면 컴파일에러
  • super(매개값, ...)는 반드시 자식 생성자 첫 줄에 위치해야 한다. - 아니면 컴파일 에러 발생

 

4. 메소드 재정의 (Overriding)

  • 자식 클래스에서 부모 클래스의 메소드를 사용하기 적합하도록 수정해서 사용하는 방법.
  • 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것

① 메소드 재정의 규칙

  1. 부모의 메소드와 동일한 시그너처 ( 리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  2. 접근 제한을 더 강하게 재정의할 수 없다.
  3. 새로운 예외(Exception)를 throws할 수 없다.

※ 접근 제한을 더 강하게 재정을 할 수 없다 ? 

더보기
부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.

 

@Override 어노테이션

  • 해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스

public class Calculator {
	double areaCircle(double r) {
    	System.out.println("Calculator 개체의 areaCircle()실행");
        return 3.14159 * r * r ;
    }
}

//자식 클래스 // 재정의

public class Computer extends Calculator {
    @Override //어노테이션 생략 가능
    double areaCircle(double r) {
    	System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;   
    }
}

//메소드 재정의 테스트

public class ComputerExample {
	public static void main(String[] args) {
    	int r = 20;
        
        Calulator calculrator = new Calculator();
        System.out.println(calculatro.areaCircle(r)); //314.159
        
        Computer computer = new Computer();
        System.out.println(computer.areaCircle(r)); //314.1592653589793
        
    }
}

 

③ 부모 메소드 호출

  • 자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
  • 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
  • super.부모메소드();

 

 

5. Final 클래스와 Final 메소드

  • 클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
  • final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
  • final 키워드 때문에 최종적인 클래스가 되기 때문이다.
  • 마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드

public class Car {
    //필드
    public int speed;
    
    //메소드
    public void speedUp(){ speed += 1; }
    
    //final 메소드
    public final void stop() {
    	System.out.println("차를 멈춤");
    	speed = 0;
    }
}


public class SportCar extends Car {
    @Override
    public void speedUp(){ speed += 10; }
    
    @Override
    public void stop(){
    	System.out.println("스포츠카를 멈춤");   //stop()은 final 메소드기 때문에 재정의 할 수 없음
        speed = 0;
    }
}

 

 

6. protected 접근 제한자

  • protected 는 public과 default 접근 제한의 중간
  • 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
  • 단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.

'Coding > Java' 카테고리의 다른 글

[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25

1. 어려웠던 부분  : 오늘 어제 다 못한 과제 후반부를 마무리했다. 게시글 수정 부분과 삭제부분도  Dto로 받아오도록 바꿔보고, 비밀번호 일치부분도 추가해 줬다. 어느정도 과제를 제출할 수 있는 정도로 마무리했더니 하루가 다 갔다. 

 

2. 느낀 점 : 조원들과 각자 작성한 과제 코드리뷰를 진행했다. 이렇게 길게 코드리뷰를 하는 건 처음이라 신기하기도하고, 많이 배울 수 있었다. 물론 너무 지치긴 했지만, 경력자신 지성님이랑 소영님 코드를 통해 많이 배울 수 있는 것 같다.

 

3. 새로 알게 된 내용 : dto와 entity의 차이점 - dto를 사용하는 이유는 디비에 저장된 데이터를 가공해서 쓰기 때문에 보안상으로 좋고, 효율적이기 때문이다. 서비스 규모가 커질수록 dto수도 많이 늘어날 수 밖에 없는데, 앞으로 코드를 작성할때 dto를 많이 만드는 것을 두려워 하지 말자. 

 

4. 셀프칭찬 (오늘 잘한 일) : 어찌 저찌 일단 과제를 끝냈다. 100프로 이해한 상태는 아니라 코드를 다시 리뷰해 보면서 흐름을 이해해야 하지만, 그래도 불과 이틀 전에 막막하던 과제가 생각보다 일찍 끝나서 내일은 하루정도 부족한 공부를 할 수 있을 것 같다. 블로그에 차마 정리하지 못했던 개념들도 정리할 수 있을 것 같다.

 

5. 내일 할 일 : chap07-1 공부(오전 11시 까지), 코드 다시 확인하면서 이해해기, 스프링 개념 정리하기, SQL강의


[오늘 공부한 부분]

  • CRUD 세션 (스프링 _ 라이브 코딩을 진행해 주셨다.)
  • 게시판 구현 과제 마무리
  • 언어스터디 + 코드리뷰

오늘 제출한 과제 정리 노션 링크 ↓↓↓↓↓

https://www.notion.so/99-project-fd980a97411d4802a7055f45ae3b43a9

 

항해99 게시판 project

Spring 입문 주차 개인 과제

www.notion.so

[02] 항해99 주특기 입문 1주차 (1-1) - Use Case, API 명세서

 

[02] 항해99 주특기 입문 1주차 (1-1) - Use Case, API 명세서

Use Case 그려보기 이렇게 하는게 맞는지 모르겠지만, 일단 https://narup.tistory.com/70 링크를 참조해서 그려본 Use Case API 명세서 만들기 참고로 RESTful한 API가 되기 위한 규칙이 몇 가지 있는데, (게시글

leejincha.tistory.com

[03] 항해99 주특기 입문 1주차 (1-2) - PostMan/h2-console

 

[03] 항해99 주특기 입문 1주차 (1-2) - PostMan/h2-console

PostMan ① POST 확인하기 ( 게시글 생성 ) PostMan 어플을 실행한다. 나는 편의를 위해 왼쪽 사이드바 New Collection 부분에 필요한 url을 미리 저장해 놓았다. 위 사진의 순서대로 진행해 준다! 특히 주의

leejincha.tistory.com

 

+ Recent posts