저는 지금까지 웹 API개발을 파이썬+장고 조합으로 개발해 왔습니다.
이제 자바+스프링을 배우면서 장고와 다른 패턴 때문에 이해하는데 시간이 좀 걸렸습니다.
본 포스팅은 장고와 스프링의 기본 CRUD패턴을 비교해 봅니다.
스프링의 코드는 이동욱님의 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스"를 토대로 합니다.
스프링을 이해하기 위해서 썼으므로 스프링 자료가 훨씬 풍성합니다.
⚠️본 포스팅은 제가 이해를 하기 위해서 최대한 장고와 비교를 해가며 스프링을 이해하기 위해서 작성했습니다.
틀린 부분이 (많이)있을 수 있습니다.
1. runserver와 main
우선 장고에서 서버를 킬 경우를 살펴보면
프로젝트 경로/python3 manage.py runserver
위와 같은 명령어로 실행 됩니다.
같은 경우 스프링을 살펴보면
Application 클래스의 main메소드를 실행하면서 서버를 킬 수 있습니다.
어노테이션
@SpringBootApplication 어노테이션은 스프링 부트의 가장 기본적인 설정을 선언해 줍니다.
2. models.py와 domain
장고의 models.py와 스프링의 domain에 대해서 비교해보겠습니다.
장고의 경우 startapp <app명>명령어를 실행하면 app명의 폴더가 생기고 하위에 models.py, views.py등이 생겨납니다.
반면 스프링의 경우 본인이 직접 폴더를 생성해서 나누어 주어야 합니다.
우선 장고의 models.py를 보면
class Product(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=10, decimal_places=3)
discount_percent = models.DecimalField(max_digits=5, decimal_places=3,blank=True)
is_new = models.BooleanField(default=False)
category = models.ForeignKey('category', on_delete=models.SET_NULL,null=True)
like = models.ManyToManyField(User,through='Userproductlike',related_name='products')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
이런 식으로 models.py에 필드명과 컬럼명, 컬럼타입, 속성을 적고 makemigrations명령어와 migrate명령어를 통해 db에 테이블을 생성합니다.
자바의 도메인을 보면 이와 유사한것을 볼 수 있습니다.
import com.sdk.springboot.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
domain에 posts클래스는 post라는 테이블의 명세서와 같은 역할을 하는 것 같습니다.
칼럼명과 칼럼의 속성을 정의하기도 하고 생성자를 만듭니다.
또 장고와 다르게 장고에서는 Post.objects.update를 통해 수정이 가능했다면
스프링의 경우 update메소드를 직접 선언해주고 있습니다.
어노테이션
@Entity 데이터베이스의 테이블과 매핑하는 역할을 합니다.
@NoArgsConstructor 파라미터가 없는 생성자를 생성합니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) 기본 키 생성을 데이터베이스에 위임
관련 어노테이션 자세한 설명링크: https://data-make.tistory.com/610
[JPA] 엔티티와 매핑. @Entity, @Table, @Id, @Column..
| 엔티티와 매핑 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23..
data-make.tistory.com
스프링에서는 domain폴더에 posts클래스와 함께 인터페이스로 postsrepository도 만들어 줍니다.
repository에 대해서 설명하자면
-Entity에 의해 생성된 DB에 접근하는 메서드(ex) findAll()) 들을 사용하기 위한 인터페이스이다. 위에서 엔티티를 선언함으로써 데이터베이스 구조를 만들었다면, 여기에 어떤 값을 넣거나, 넣어진 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)를 해야 쓸모가 있는데, 이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다.
JpaRepository를 상속받도록 함으로써 기본적인 동작이 모두 가능해진다! JpaRepository는 어떤 엔티티를 메서드의 대상으로 할지를 다음 키워드로 지정한다. JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>.
출처:https://whitepro.tistory.com/265
스프링 부트 : 기본 개념 1) Entity, Repository 개념
개인적인 정리와 기록을 위한 글이다. 혹시라도 참고해주시는 분들께서는 정확하지 않은 내용이 많으니 유의해주시길 바란다. 자바 진영의 백엔드 개발을 아무런 지식없이 시작하게 되었다. 현
whitepro.tistory.com
3. 장고의 urls.py, views.py 스프링의 controller
장고에서 스프링으로 넘어오면서 가장 헷갈린 부분이 스프링의 controller와 service 였습니다.
장고를 생각해보면 urls.py에 엔드포인트 규칙을 적고 각 규칙마다 어떤 view함수를 실행할지 연결해 놓습니다.
스프링과 비교를 해보면 Controller가 urls.py의 역할과 비슷한 것 같습니다.
다만 차이가 있가면 스프링에서는 controller에 request메소드를 정합니다. 또 쿼리 파라미터 규칙도 정하고 메소드의 리턴문을 통해 데이터가 전송됩니다.
이부분이 가장 차이가 있어서 헷갈렸던 것 같습니다.
장고의 경우 urls.py의 규칙에 맞는 view함수를 매핑해서 -> view.py파일에 해당하는 메소드에서 모든 로직을 관리했는데
스프링의 경우 controller와 연결된 부분이 하나가 아니고 Dto service등으로 나누어져 있어서 헷갈렸습니다.
이제 하나하나 살펴 보겠습니다.
Dto
우선 Dto에 대해서 알아보겠습니다.
DTO: 계층간 데이터 교환을 위한 객체(Java Beans)이다.
DB에서 데이터를 얻어 Service나 Controller 등으터 보낼 때 사용하는 객체를 말한다.
출처: https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html
도대체 이게 뭔소린가 싶었는데
장고로 비교해서 생각해보면
view함수에서 Post테이블을 수정하려면
post = Post.objects.get(id=1)
이렇게 사용했습니다.
Post라는 객체를 만들어서 사용했었는데요
데이터베이스에서 접근을해서 가져온 값을 객체로 담았다고 생각할 수 있습니다.
스프링에서도 이렇게 데이터 베이스의 값을 객체화 시켜서 변경하고 저장하는 것 입니다.
일종의 데이터 베이스와 매개체라고 할 수 있습니다.
service로직에 사용될 것 입니다.
Service
서비스는 서비스 로직을 정의해 줍니다.
장고로 얘기해보자면 view.py에 들어가는 로직이라고 생각하면 됩니다.
Dto에서 정의된 클래스를 가지고 로직을 다루는 부분입니다.
'스프링 입문' 카테고리의 다른 글
🍀 @JsonProperty (0) | 2021.10.23 |
---|---|
🍀 스프링 PostController (0) | 2021.10.23 |
🍀 스프링 Get Controller (0) | 2021.10.23 |
🍀 스프링 welcome page 연결하기 (0) | 2021.10.06 |
🍀 스프링 프로젝트 시작하기 (0) | 2021.10.05 |