튜토리얼
Controller
@RestController를 추가해주면서 Getmapping등의 Mapping 주소를 받는다.
Test Code
private MockMvc mvc
//웹 API를 테스트할때 사용
mvc.perform(get("/hello")) // -> hello주소로 http get을 요청함
.andExpect(status().isOk()) // -> 결과의 상태를 검증함
.andExpect(content().string(hello)) //-> hello랑 콘텐츠의 결과값이 같은지 확인
Dto
생성자들을 처리해줌
@Getter
@Getter
@requiredArgsConstructor
public class HelloresponseDto{
private final String name;
private final int amount
}
TestCode
HelloResponseDto dto = new HelloResponseDto(name,amount);
assertThat(dto.getName()).isEqualTo(name) //테스트 검증 라이브러리
Controller에서도 Dto 사용하기
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){
return new HelloResponseDto(name, amount);
}
Dto 사용한 controller 테스트
String name = "hello";
int amount = 100;
mvc.perform(
get("/hello/dto")
.param("name", name) //인자값 넣어주기
.param("amount", String.valueOf(amount)))
.andExpect(status().isOk))
.andExpect(jsonPath("$.name", is(name)))
.andExpect(jsonPath("$.amount", is(amount))); //jsonPath는 JSON 응답값을 필드별로 검증
//$를 기준으로 필드명 명시
게시판 만들기
domain 폴더는 게시글, 댓글, 회원, 정산, 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역
Posts클래스
@Getter
@NoArgsConstructor
@Entity // -> 테이블과 링크될 클래스임을 나타냅니다
public class Posts extends BaseTimeEntity {
@Id // -> PK인 것을 나타냅니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // -> auto_increment 추가
private Long id; //-> 왠만하면 Long으로 하기
@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;
}
}
PostRepository -> DB Layer 접근자.
JpaRepository<Entity 클래스, PK타입>을 상속하면 CRUD 메소드 자동생성
public interface PostsRepository extends JpaRepository<Posts,Long> {
}
Test Code
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After //단위테스트가 끝날때마다 해주는 것 여기서는 초기화!!!
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기(){
//given
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder() //-> 테이블 posts에 insert/update쿼리 실행
.title(title)
.content(content)
.author("jiwon803@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll(); // -> 모두 불러옴
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
API 생성
API를 만들기 위해서는 총 3개의 클래스가 필요함
- Request 데이터를 받을 Dto
- API 요청을 받을 Controller
- 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service
Spring Web 계층
- Web Layer
- 흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역
- 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역
- Service Layer
- @Service에 사용되는 서비스 영역
- 일반적으로 Controller와 dao의 중간영역
- @Transactional이 사용되어야 하는 영역
- Repository Layer
- Database와 같이 데이터 저장소에 접근하는 영역
- 기존에 개발하셨던 분들이라면 Dao로 이해하면 편함
- Dtos
- Dto(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체를이야기하면 Dtos는 이들의 영역
- 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체등
- Domain Model
- 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델
- 택시 앱이라고 하면 배차, 탑승 ,요금 등이 도메인
- @Entity가 사용된 영역 역시 도메인 모델
- 무조건 데이터 베이스의 테이블과 관계가 있어야되는건 아님
104
'개발합시다. > BackEnd 공부' 카테고리의 다른 글
Django의 request & Http (0) | 2021.12.08 |
---|---|
Redis 추가공부 사항 (0) | 2021.12.08 |
Redis의 모든 것 (0) | 2021.12.07 |
mongoDB의 모든 것 (0) | 2021.12.07 |
Nginx의 모든 것 (0) | 2021.12.07 |