튜토리얼

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개의 클래스가 필요함

  1. Request 데이터를 받을 Dto
  2. API 요청을 받을 Controller
  3. 트랜잭션, 도메인 기능 간의 순서를 보장하는 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

+ Recent posts