2022/02/07 한 번에 끝내는 Spring 완.전.판 초격차 패키지

김석진·2022년 2월 9일
0

아주 단순한 구조(1 Layer)의 어플리케이션

패키지의 구조는 사람or 회사마다 차이가 있을 수있다.
강사님께서는 레이어별로 패키지를 만들어 놓고 (컨트롤러,서비스,리포지토리) 그 안에다가 모든 도메인들의 컨트롤러를 만들어 놓는거를 선호하신다고 해서 나도 따라 해볼려고 한다.

패키지들 추가

controller 패키지

@RestController
컨트롤러인데 ResponseBody를 자동으로 달아준다 라고 설명이 되어있다.
A convenience annotation that is itself annotated with @Controller and @ResponseBody.

@Slf4j
@RestController
public class DMakerController {

    @GetMapping("/developers")
    public List<String > getALlDeveldopers(){
        //GET /developers HTTP/1.1
        log.info("GET /developers HTTP/1.1");
        return Arrays.asList("snow","Elsa","Olaf");
    }

}
실행결과



세팅해둔 Log와 return 값이 잘 찍히는것을 확인 할 수 있다.

H2 DB설명, 간단한 DB저장 기능 구현

H2 DB?

MySQL,Oracle같은경우 단독으로 설치해야함
메모리 DB로 주로 사용하고, 메모리에도 쓸수 있고 파일에서도 사용할 수있다.

Entity

강사님께서는 Entity나 DTO에는 거의

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor

을 붙이 신다고 하셨다.참고로 @NoArgsConstructor
@AllArgsConstructor 두개는 Builder를 쓰려면 필수로하는 애노테이션이라고 생각하면된다(오류 덜 발생하도록).

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Developer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Enumerated(EnumType.STRING)
    private DeveloperLevel developerLevel;

    @Enumerated(EnumType.STRING)
    private DeveloperSkillType developerSkillType;

    private Integer experienceYears;
    private String memberId;
    private String name;
    private Integer age;

    @CreatedDate
    private LocalDateTime createdAt;
    
    @LastModifiedDate
    private LocalDateTime updatedAt;

}

@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
자동으로 SpringDataJPA 내부에 있는 기능들 중에서 값을 세팅해 주는 기능이다.

    
@EnableJpaAuditing //이걸 추가 해줘야 수정이 있으면 Spring에서 자동으로 수정해줌
@SpringBootApplication
public class DmakerApplication {

	public static void main(String[] args) {
		SpringApplication.run(DmakerApplication.class, args);
	}

}

그리고 엔티티를 저장해줄 Repository를 세팅해준다.

@Repository
public interface DeveloperRepository extends JpaRepository<Developer,Long> {
}

service

Service레이어를 담당(비지니스 로직)하는 로직을 만들예정
이름 DMakerService
서비스나 컨트롤러는 @RequiredArgsConstructor를 추가하는게 편리하다

이유)
@Service
@RequiredArgsConstructor
public class DMarkerService {
private final DeveloperRepository developerRepository;
}
자동으로 repository를 injection 해준다.
예전에는 @Autowired나 @Inject를 사용했었는데 문제점( 서비스 코드가 너무 어노테이션들에게 종속적으로 만들어져 서비스를 단독으로 테스트하기 어려운 문제점이있음)
이 있어서
요즘은 이렇게 코드짜는것으로 바꼈다.

디롬복을 시켜보면

이렇게 생성자를 자동으로 생성시켜준다(이유 final이기 때문에)

컨트롤러에 service 를 추가하기

넓은 레고판 위에

이런식으로 만들어 져 있다고 생각하면된다.

profile
주니어 개발자 되고싶어요

0개의 댓글