1교시 클라이언트에게 데이터를 받아오는 방법
Get 방식과 Post방식
//Get 방식
@RequestMapping("/login")
public String login(String id, String pw){
//URL에 있는 파라미터가 자동으로 매개변수에 저장된다.
//쿼리로 ID,PW전달 받고
System.out.println("id:"+id+ ", pw: "+ pw);
//DB 연결 객체 가져와서
//insert
return "login";
}
위 코드는 URL을 통해서 id pw를 전달할 수 있다.
아무도 이렇게 안 만든다.
로그인 페이지를 보여주는 기능과 로그인 정보를 처리하는 기능을 나눠야한다.
2교시
Get post 나누는 방법
@RequestMapping(method = RequestMethod.POST,value = "/login")
public String login(String id, String pw){
//쿼리로 ID,PW전달 받고
System.out.println("id:"+id+ ", pw: "+ pw);
if(id.equals("kty") && pw.equals("qwer1234")){
return "redirect:/index";
}else return "redirect:/userFeat/login";
}
@RequestMapping(method = RequestMethod.GET,value = "/login")
public String login(){
return "/userFeat/login";
}
3교시
3계층 아키텍쳐 구현 방식
프론트, 벡 , DB로 나눈다.
이때 @Controller가 아니라
@RestController를 쓴다.
@RestController는 뷰 리졸브가 작동하지 않는다.
return하는 객체 그대로 전달한다.
postman를 써서 프론트 서버의 역활을 맡긴다.
4교시 DTO 만들어서 데이터 받기
MVC 모델에서 model
대표적인 모델 종류
1.DTO (클라이언트 - 백엔드 서버)
2.VO (클라이언트 - 백엔드 서버)
3.Entity (백엔드 서버 - DB server)
꼭 구분해야하는 건 아니다. 하지만 DB에서 가져온 정보를 그대로 클라이언트에 보내면 안된다는 걸 의식해야한다.
Lombok
1) Lombok
Lombok(롬복)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리
보통 Model 클래스나 Entity 같은 도메인 클래스 등에는 수많은 멤버변수가 있고 이에 대응되는 getter와 setter 그리고 toString() 메서드 그리고 때에 따라서는
멤버변수에 따른 여러개의 생성자를 만들어주게 되는데, 거의 대부분 이클립스같은 IDE의 힘만으로 생성한다고 하지만 이 역시도 번거로운 작업이 될 수 있다.
뿐만 아니라 코드 자체가 반복되는 메서드로 인해 매우 복잡해지게 된다.
Lombok은 여러가지 어노테이션을 제공하고 이를 기반으로 코드를 컴파일과정에서 생성해 주는 방식으로 동작하는 라이브러리
즉 코딩 과정에서는 롬복과 관련된 어노테이션만 보이고 getter와 setter 메서드 등은 보이지 않지만 실제로 컴파일된 결과물(.class)에는 코드가 생성되어 있다는 뜻입니다.
2) 사용방법
@Getter : 변수에 값을 받아갈 수 있는 메소드 생성
@Setter : 변수에 값을 설정할 수 있는 메소드 생성
@ToString : 변수의 값을 출력하는 메소드 생성
@NoArgsConstructor : 매개변수가 없는 생성자 생성
@AllArgsConstructor : 매개변수로 모든 변수의 값을 성정하는 생성자 생성
@Data : 위의 모든 어노테이션을 한번에 적용할 수 있는 어노테이션
@Builder : 빌더 디자인 패턴으로 객체를 생성할 수 있게 해주는 어노테이션
layered 아키텍쳐
5교시
스프링 객체 생성
@RequestMapping("register")
public String signin(UserRegisterDto userRegisterDto){
System.out.println("id:"+userRegisterDto.getId()+ ", pw: "+ userRegisterDto.getPw());
System.out.println(userRegisterDto.getEmail());
UserService userService = new UserService(); // 나쁜 코드
return userService.register(userRegisterDto);
}
요청이 들어올 때마다 객체를 생성하는 나쁜 코드임.
그럼 서비스를 사용할려면 객체가 필요한데 어떻게 해야할까?
의존성 주입(DI)
UserService 클라스에 service 어노테이션을 달면
Bean으로 생성되고
@Autowired로 객체를 가져와 저장할 수 있다.
@Autowired가 좋은 문법은 아니지만 개념을 잡기 위해 일단 써보자. (4가지 방식이 있다.)
주로 생성자 주입 방식을 쓰지만 면접 대비용으로 알아두자.
6교시
의존성 주입할 때 생성자 주입을 주로 쓰는 이유는 객체의 변경이 잘 없기 때문이다. 생성자가 최초로 설정한 값이 바뀔일이 없는데 다른 접근 가능한 매소드가 있는게 마음에 안든다.
게다가 순환 참고나 의존성 주입을 깜박할 가능성이 있지만 생성자로 의존성 주입을 하면 인텔리제이가 에러를 알려준다.
Http 응답 매소드 이용하기
ResponseEntity를 이용해서 요청에 대한 응답을 해보자.
@RequestMapping(method = RequestMethod.POST,value = "/login")
public ResponseEntity<Object> login(UserLoginDto userLoginDto){
//쿼리로 ID,PW전달 받고
System.out.println("id:"+userLoginDto.getId()+ ", pw: "+ userLoginDto.getPw());
//UserService userService = new UserService();
if(userService.login(userLoginDto))
return ResponseEntity.ok().body(userService.login(userLoginDto));
else{
return ResponseEntity.badRequest().body(userService.login(userLoginDto));
}
}
7교시 DB연결하기
1. maven pom.xml에 jdbc추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
resources/application.yum 생성
(application.property는 옛날 방식)
spring:
datasource:
url: jdbc:mysql://192.168.72.30:3306/lonua
username: kty
password: qwer1234
driver-class-name: com.mysql.cj.jdbc.Driver
이러면 스프링이 DataSource 객체를 만들어준다.
public class Dao {
private JdbcTemplate jdbcTemplate;
public Dao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public boolean insert(BrandDto brandDto){
String sql = "INSERT INTO 어쩌구";
Objects[] args = new Objects[]{};
jdbcTemplate.update(sql,args);
return true;
}
}