@Controller 어노테이션
- 역할
- @Controller 어노테이션은 클래스를 컨트롤러로 선언하며, Spring MVC의 웹 요청을 처리하는 데 사용됩니다. 이 클래스는 HTTP 요청을 처리하고, 적절한 응답을 반환합니다.
- 기능
- HTTP 요청을 처리하는 메서드를 정의할 수 있습니다.
- 메서드는 @RequestMapping 또는 그 하위 어노테이션(예: @GetMapping, @PostMapping)을 통해 요청 URL과 매핑됩니다.
- 요청을 처리한 후, 응답을 뷰(View)로 반환하거나 데이터를 JSON/XML 형식으로 반환할 수 있습니다.
나의 첫 컨트롤러이다.
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class FirstController {
@GetMapping("/hi")
public String niceToMeetYou(Model model){
model.addAttribute("username","민기");
return "greetings";
}
}
모델은 컨트롤러의 메서드에서 매개변수로 받아 오게 된다. 모델에서 변수를 등록할 때는 addAttribute("변수명",변숫값)을 사용하여 받아오게 된다.
뷰템플릿 기술을 사용할때 이용하게 되는 방식을 보여주고 있다. greetings라는 템플릿을 서버가 자동으로 찾아주어 model의 변수를 전달해주게 된다.
import com.example.firstproject.dto.ArticleForm;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ArticleController {
@GetMapping("/articles/new")
public String newArticleForm(){
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form){
System.out.println(form.toString());
return "articles/create";
}
}
입력 받는 폼을 만드는 연습을 하였다. 새로 만든 폼을 만든 후에 DTO(data transer object)를 통한 컨트롤러가 객체로 받아오게 된다. DTO는 데이터 객체인 샘이다.
template의 html의 form 데이터에서 action과 method를 잘 설정해둔 후에 만들어둔 DTO ArticleForm과의 필드들과 매칭시켜준다면 문제 없이 잘 연결되게 된다.
DTO로 받아온 데이터를 DB에 저장하기 위해서는 DB가 자바 객체를 이해가능하도록 Entity로 바꾸어 넣어주어야 한다.
이를 엔티티로 받기 위해서 따로 클래스를 만들어 주어야 한다.
@Entity
@Entity 어노테이션은 Java Persistence API(JPA)에서 사용되는 어노테이션으로, 데이터베이스 테이블과 매핑되는 클래스임을 나타냅니다.
JPA는 Java에서 객체-관계 매핑(ORM)을 제공하는 기술로, 데이터베이스와 자바 객체 간의 매핑을 관리합니다.
@Entity는 JPA의 핵심 어노테이션 중 하나로, 데이터베이스의 테이블과 자바 객체를 연결하는 역할을 합니다.
@Entity 어노테이션의 주요 기능
- 테이블과의 매핑
- @Entity가 적용된 클래스는 데이터베이스의 테이블에 매핑됩니다. 클래스의 각 인스턴스는 테이블의 한 행(row)과 대응됩니다.
- 기본 생성자 필요
- @Entity 클래스는 기본 생성자를 가져야 합니다. JPA는 리플렉션을 사용하여 객체를 생성하기 때문에 기본 생성자가 필요합니다.
- *리플랙션:
- 식별자 필요
- @Entity 클래스는 데이터베이스에서 각 객체를 고유하게 식별할 수 있는 식별자 필드(Primary Key)를 가져야 합니다. 이 필드는 @Id 어노테이션을 사용하여 정의됩니다.
package com.example.firstproject.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class Article {
@Id
@GeneratedValue//자동으로 id를 생성해주는 어노테이션
private Long id;
@Column
private String title;
@Column
private String content;
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
@GenratedValue: 자동으로 id를 생성해주는 어노테이션이다.
@Id: 식별자 어노테이션
public Article toEntity() {
return new Article(null,title,content);
}
DTO 코드도 수정하였다. 엔티티로 변환해주는 메서드를 추가하였는데 id에 대한 정보는 없기 때문에 null로 채우게 된다.
@Controller
public class ArticleController {
@Autowired//스프링부트에서 미리 만들어둔 객체를 주입해준다.
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm(){
return "articles/new";
}
@PostMapping("/articles/create")
public String createArticle(ArticleForm form){
System.out.println(form.toString());
Article article = form.toEntity();
articleRepository.save(article);
return "articles/create";
}
}
컨트롤러도 다시 수정하게 되었는데, 이때 repository를 만드는 방식에서
@Autowired 어노테이션을 활용하게 된다면 spring boot에서 만들어 놓은 레파지토리 객체를 주입해주게 된다. 즉 새로 new로 객체를 만들 필요가 없어진다.
package com.example.firstproject.repository;
import com.example.firstproject.entity.Article;
import org.springframework.data.repository.CrudRepository;
public interface ArticleRepository extends CrudRepository<Article,Long>{
}
JPA를 활용해서 DB에 접근하여 저장할 수 있게 해주는 레파지토리 또한 생성해주었다. 인터페이스 형태로 생성하게 되며,
CrudRepository 를 extends하여 JPA에서 제공하는 인터페이스를 활용가능하다.
<>안에는 차례로 넣게될 엔티티,식별자의 타입을 넣어주게 된다.
이제 DB에 잘 데이터가 저장 되었는지를 확인하기 위해 H2 데이터 베이스를 확인할 차례이다.
H2 데이터를 웹 콘솔로 접근하기 위해서 application.properties에서
spring.h2.console.enabled=true
를 추가해주어야 한다.
다시 localhost:8080/h2-console에 들어가게 되어 JDBC URL을 내 spring에서 띄어주는 jdbc주소를 넣어주게 되어야한다.
코드 리팩토링을 위해 롬복에 대해 알아보자
lombok
코드를 간소화해 주는 라이브러리이자 @DATA를 활용해 코드 반복 최소화를 해주게 되고, @Slf4j를 활용하여 로깅 기능을 지원해주게도 된다. 로깅이란 프로그램의 수행 과정을 기록으로 남기는 것을 말한다.
@AllArgsConstructor: 필드 값들을 사용하는 생성자 자동 생성
@ToString: tostring메서드 어노테이션
@Slf4j:로그 남기는 어노테이션
log.info(saved.toString())을 사용하면 된다.
'프로그래밍 > Backend' 카테고리의 다른 글
나만의블로그만들기(3) (1) | 2024.08.01 |
---|---|
REST API 뼛속까지 탐구하기 (0) | 2024.08.01 |
HTTP는 누구일까 (1) | 2024.08.01 |
나만의블로그만들기(2) (0) | 2024.08.01 |
MVC 패턴 (0) | 2024.07.31 |