스프링 시작

오늘 스프링 수업을 시작했다. JAVA 기초 문법 강의를 들었지만 아직 이해가 가지 않는 부분이 있었던 만큼 이번 스프링 수업동안 바짝 긴장해서 모두 나의 기술로 만들 수 있는 시간이 되었으면 좋겠다. 이번 기간에는 평소처럼 개념정리 뿐만 아니라 프로젝트 진행 과정까지 모두 작성할 예정이다. 그리고 오늘 수업에서 흥미로운 것을 배웠는데 구글트랜드 서비스를 이용해 바로 세계적인 트렌드에 대해 알아 볼수 있는 방법이다. 아래 링크에서 트렌드 키워드를 검색하면 전세계적으로 어떤 키워드가 더 많이 검색됬는지 보여준다.

https://trends.google.com/trends/explore?q=java,nodejs

오늘 한 일

  • Spring 프로젝트 생성 및 기본 실습
  • JPA 생성

⛏Spring Framwork

파이썬과 JAVA의 다른점은 여러가지가 있겠지만 내가 오늘 수업을 듣고 실습을 하면서 깨달은 차이점은 바로 자바에서는 변수에 타입을 일일이 다 정의내려줘야 한다는 것이다. 파이썬에서는 변수를 선언만 해주면 들어가는 값에 따라 자동으로 타입이 정의 됬는데 자바에서는 변수 또는 함수의 출력 값의 타입을 지정해줘야한다는 것이다. 그 외에도 다양한 차이점이 있다.

🥕Spring Boot

그렇다면 스프링과 스프링 부트의 차이점은 무엇일까?
스프링은 서버를 개발하기 위한 프레임워크이다 그리고 스프링 부트는 스프링에서 개발을 위해 설정해주던 부분을 자동설정을 이용해서 어플리케이션 개발에 필요한 모든 내부 디펜던시를 관리하여 개발자가 어플리케이션 개발에 더 몰입할 수 있는 환경을 만들어주었다. 이와 같은 사례로 spring Boot 내부에 Tomcat이 포함되어 있어 Tomcat을 설치하거나 버전을 관리할 수고를 덜어주었다.

🥕Spring 기본 레이어

  • Controller : 클라이언트에게 요청을 받고 응답을 해준다. 요청에 대한 처리는 Service에게 전담한다.
  • Service : 비즈니스 로직을 처리한다. DB 정보가 필요할 때는 Repository에게 전담한다.
  • Repository : DB를 관리하고 DB CRUD 작업을 수행한다.

💪Spring 프로젝트 생성하기!

나는 IntelliJ를 사용해서 Spring 프로젝트를 생성했다.

Language : JAVA
Type : 빌드 툴
Group : 패키지
Project SDK : 1.8 // 16버전을 사용하니깐 인덱싱에서 빌드 에러가 난다.
JAVA : 8
Packaging: Jar // Tomcat에 올라갈 build의 확장자 이름이다. .Jar

Dependencies가 무엇일까? 추가적으로 알아보고 나중에 작성해 보겠다.
Lombok : JAVA 라이브러리로 반복되는 getter, setter, toString 등의 반복 메서드 작성 코드를 줄여준다.
Spring Web : 뭔지 모르겠다. 추후에 알게되면 추가할 것!
Spring Data JPA : 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트이다.
H2 Database : 자바 기반의 오픈소스 RDBMS로 인메모리 DB기능을 갖고 있는 Database이다.
MySQL Driver : MySQL과 연동시 필요하다.

이렇게 생성된 프로젝트는 localhost:8080으로 확인 할 수 있다.

  • 프로젝트 폴더 구조

    /src  // 최상위
    - /main   // 실제 프로젝트에 포함된 부분
      - /java  // 자바 파일이 위치
        - /com
          - /sparta
            - /item01
              - Item01Application.java  // 메인 파일
      - /resources # 설정파일, 스태틱 파일
          - application.properties  // 메인 설정 파일
          - /static  // 스태틱 파일(image, javascript, css, html ...)
          - /templates  // html 파일
    - /test # 테스트에 필요한 부분
      - /java
        - /com
          - /sparta
            - /item01 // 테스트 관련 자바 파일
    

🥕어노테이션이란?

어노테이션은 쉽게 말해 컴퓨터가 읽는 주석을 의미한다. 다음과 같은 세가지 용도로 사용이 된다.

@Annotation
// 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
// 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
// 실행 시 특정 기능을 실행하도록 정보를 제공

💪JAVA 이해해보기

자바를 공부하면서이해한 것을 풀어 써보려고한다.

public class Dog(){
  String kind;
  String name;
  
  public Dog(String kind, String name){
      this.kind = kind;
      this.name = name;
  }
  
  public void bark() {
  
  }
  
  public void run() {
  
  }
}
Dog dog = new Dog()
dog.name = "뽀삐"
dog.kind = "치와와"

클래스는 Dog처럼 객체를 만들어 내기 위한 틀이라고 생각할 수 있다. 개라는 종이 있어야 뽀삐라는 개라는 객체의 존재가 성립되듯
객체는 클래스라는 틀 안에서 만들어지는데 위 코드에서는 dog가 객체이다. 객체는 클래스에 따라 클래스의 메소드와 속성을 갖는다.
클래스의 이름과 같은 메소드를 생성자라고 하는데 객체를 생성할 때 객체를 초기화 해주는 역할을 한다. 생성자는 입력되는 변수가 다르면 중복이 가능하다!
클래스 내에서 사용되는 this는 객체 내에 또는 클래스 내의 변수를 가르킨다.

private은 public과 다르게 다른 클래스 내에서 private에 접근할 수 없게 만든다. 이것이 필요한 이유는 민감한 정보들은 Read&wirte가 불가능해야 하기 때문이다.

  public class student() {
    private String name;
    public String grade;
  }
  
  Tutor tutor = new Tutor();
  tutor.name = "Kwnaghun" // 불가능!
  tutor.bio = "senior" // 가능!

그렇다면 private한 변수의 값을 어떻게 보거나 수정할 수 있을까? 바로 GetterSetter를 사용하면 된다. 변수들을 private처리하고 Getter와 Setter를 추가해서 내부의 값을 모니터링 하는 것이 자바 개발자들의 전통? 이라고 한다.

  public class Student() {
    private String name;
    public String grade;
    
    public String getName() { // Getter
        return this.name;
    }
    
    public void setName(String name) { // Setter
        this.name = name
    }
  }
  
  Student student = new Student();
  tutor.name = "Kwnaghun" // 불가능!
  tutor.bio = "senior" // 가능!
  
  System.out.println(student.setName('kwanghun'))
  System.out.println(student.getName) // kwanghun
  

추가로 voidstatic는 무엇을 의미할까? void는 메소드의 return의 존재 유무이다. void가 있으면 return이 존재하지 않고 void가 있으면 return값이 존재한다.
Static가 있으면 클래스 자체를 객체화가 필요 없이 사용 가능하게 된다.

🥕Gradle이 무엇인가?

python의 PIP와 같은 역할을 한다. 라이브러리를 설치하고 사용할 수 있도록 도와주는 역할을 한다. 라이브러리 설치는 mavenrespository에서 할 수 있다.

https://mvnrepository.com/

Build.Gradle에 dependencies 안에 코드를 넣어준 후 옆에 있는 실행 버튼을 누르면 적용된다!

언어별 라이브러리 설치 tool

  • javascript : NPM
  • python : PIP
  • java : mavenrepository, jcenter

🥕RDBMS

내가 구축할 서버의 DB에 해당하는 부분으로 관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어이다. 이러한 소프트웨어의 종류로는 다음과 같다.

MySQL
PostgreSQL
Oracle Database

스프링 원격수업 실습에서 사용할 RDBMS는 H2이다. H2는 자바 기반의 오픈 소스 데이터베이스이다. 또한 인메모리 DB이기 때문에 서버가 작동을 멈추면 데이터가 모두 삭제된다. 이러한 특징때문에 실습 또는 연습에서 사용하기 적절하다.
이후 3차 프로젝트에서는 MySQL을 사용할 예정이다.

🥕H2 웹콘솔

H2를 사용하기 위해서 프로젝트를 생성할 때 H2 Database을 추가했었다.

src > main > resources > application.properties
// 위 경로에 아래 문장을 복사 붙여넣기 해준다.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb

이후 스프링부트를 실행한 다음 다음의 주소로 접속하해서 connect하면 H2 웹콘솔을 사용할 수 있다.

http://localhost:8080/h2-console

🥕JPA

JPA를 알기 전에 ORM(Object-Relational Mapping)에 대해서 알아보자. ORM은 Class와 RDB의 테이블을 연결해준다는 뜻이다. 즉 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 RDB와의 불일치를 해결하는 것이다. 이를 통해 개발자는 메서드로 데이터를 조작할 수 있어 개발에 집중할 수 있게 되었다.
그렇다면 JPA는 무엇일까? 바로 JAVA에서 ORM 기술 표준으로 사용하는 인터페이스 모음이다. 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 하지만 이제 실습에서 사용할 JPA는 jpa를 이용하는 spring-data-jpa 프레임워크이고 JPA그 자체는 아니라고한다.
즉, 결과적으로 JPA 프레임워크를 쓰면 개발할 때 자바 언어로 프로그램을 짜다가 중간에 SQL로 짜는 복잡한 상황을 방지하고 자바로 모두 제어할 수 있게된다.

🥕JPA 실습

src > main > java > com.sparta.item01
// 위 경로에 domain이라는 패키지를 만든다.
// domain : MySQL에서 Table을 의미한다.
//domain폴더에 Lecture.java를 생성한다.

@Entity // 테이블임을 나타냅니다.
public class Lecture {

		public Lecture() {}

  @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
  @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
  private Long id;

  @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
  private String title;

  @Column(nullable = false)
  private String tutor;

  public Long getId() {
      return id;
  }

  public String getTitle() {
      return this.title;
  }

  public String getTutor() {
      return this.tutor;
  }

  public Lecture(String title, String tutor) {
      this.title = title;
      this.tutor = tutor;
  }
}
// domain폴더에 LectureRepository.java를 interface로 만들어준다.

public interface LectureRepository extends JpaRepository<Lecture, Long> {
}

이때, JPA는 Repository를 통해서만 사용할 수 있다. 그렇기 때문에 인터페이스는 클래스에서 멤버가 빠진 메소드 모음집이라고 보면 된다.(아직 잘 모르겠다 계속 공부해봐야겠다.ㅠㅠㅠㅠ)


✔생각 정리

JPA에 대한 개념이 아직 잘 안잡힌다 차근차근 다시 한번 되새김질해보면서 익혀봐야겠다.

  • JPA Repository란?
  • interface 왜 사용하는지?
profile
잘 부탁드려요

2개의 댓글

comment-user-thumbnail
2021년 11월 4일

와아 제가 잘 모른 채로 넘어갔던 것들이랑 적용 방법이 같이 있어서 넘모 도움이 됐습니다...!🙊
특히나 중간중간 당근들이 도움을 외치는 것 같아 인상적인 글이군요... :)
잘 읽고 갑니당

1개의 답글