본문 바로가기

Java/Spring

7.25 lombok 라이브러리 추가, 의존성 주입, Javax Annotation API

redirect 방식으로 전달하기

 

a태그 : 전송방식 get방식.

redirect해주려면 response 필요함.

 

@controller에서 

 

@GetMapping("redirect")
public String redirect() {
return "redirect:main.home";
}

리턴값에 redirect: 라고 지정하면 다시 요청을 전달한다. (response 전달할 필요 x)

 


https://projectlombok.org/download

 

Download

 

projectlombok.org

 

경로 설정 : sts-bundle>RELEASE>sts.exe 

 

pom.xml에 lombok라이브러리 추가(MAVEN repository참고)

 

 

사용 예시 1 )

 

클래스 파일 UserVO 생성

 

package com.bitc.lombok;

import java.util.Date;
import java.util.List;

import lombok.Data;

@Data
public class UserVO {

private int uno;
private String uid;
private String upw;
private String uname;
private Date regdate;
private List<String> friendList;
}

 


사용예시 2)

 

@Getter
@Setter
@ToString(of = {"uno","uname","friendList"})
@EqualsAndHashCode (exclude= {"uno","uname","regdate","friendList"})
// @NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor // 객체 생성시 필요한 필수값으로 생성자 만듬
@Builder
public class UserVO {

private int uno;

// 필수값으로 지정
@NonNull
private String uid;  
@Getter // 해당되는 필드에만 getter 생성
private final String upw;// 생성자를 통해서 무조건 초기화해야하는 final
@Setter
private String uname;
private Date regdate;

@Singular("list")
private List<String> friendList;
}


src/test/java에서 junit 이용해서 test해보자

 

 

package com.bitc.lombok;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class LombokTest {

@org.junit.Before
public void before() {
System.out.println("test 전");
}

@org.junit.Test
public void test() {
System.out.println("Test 실행 method");

UserVO vo = new UserVO("id001","pw001");
System.out.println(vo);
vo.setUno(1);
vo.setUname("최기근");
vo.setRegdate(new Date());
List<String> friendList = new ArrayList<>();
friendList.add("펭수");
friendList.add("뽀로로");
friendList.add("뿡뿡이");
vo.setFriendList(friendList);
System.out.println(vo);

UserVO user = UserVO.builder()
.uno(2)
.uid("id001")
.upw("pw002")
.uname("최기근")
//.friendList(friendList)
.list("김판길").list("이인").list("박준우")
.regdate(new Date())
.build();
System.out.println(user);

}

@org.junit.After
public void after() {
System.out.println("test 작업 완료");
}

}

 


servlet-context.xml


<resources mapping="/resources/**" location="/imgs/" />
<!-- 
get 방식의 요청 경로가 /imgs/ 로 시작하면 controller를 통해서 요청 처리를 하지 않고
webapp directory의 imgs 폴더에서 자원을 찾아 응답한다.
 -->
<resources mapping="/imgs/**" location="/imgs/" />

 

 


클래스를 Bean으로 생성하려면?(의존성 주입)

 

1. 먼저 클래스에 어노테이션 입력

 

@Service
public class TestServiceImpl implements TestService { }

이렇게 어노테이션 달기

 

2.  servlet-context에 <context:component-scan 추가




  DI Annotation (Dependency Injection) - 의존성 주입 : (IOC 제어의 역전....) 
  spring이 관리하는 bean을 우리가 원하는 필드에 주입받아 사용하게 해주는 Annotation
 * -1.8까지만 기본으로 지원(Inject, Resource),이후에는 라이브러리 (Javax Annotation API)

@Autowired @Qualifier @Inject @Resource
 */

 

// Autowired : 여러개의 동일한 타입이면 

어노테이션이 달려진  필드이름이 같은 걸 가지고 온다. 이름이 일치하는게 없으면 충돌 발생.

 

 

필드 이름을 가독성  있게 사용하고 싶은 경우?

@Autowired
@Qualifier(value="path") 이렇게 같이 사용할 수 있다. 
private String pathImage;


 

@Autowired(required = false) //기본값은 true
TestService ts; // new TestServiceImpl(); 가 아니고 spring에 등록시켜놓고 가져와서 사용함

 


@Service("ts") <- Bean 이름을 지정할 수 있다.
public class TestServiceImpl implements TestService {

setter의 매개변수 타입과 일치하는 타입의 bean 존재하면
setter를 호출하면서 Bean 전달

@Autowired @Qualifier("testDAOImpl")
public void setDao(TestDAO dao) {
this.dao = dao;
}
이를 아래와 같이 코드를 단축시킬 수 있다.


@Setter(onMethod_= {@Autowired, @Qualifier("testDAOImpl")}) //onMethod_: 메소드 위에 어노테이션 추가
private TestDAO dao;

 

 

 

 


SecondController.java (@Inject, @Resource 사용 예시)

@Resource(name="path")
private String path;

//@Inject //무조건 required 가 true, 해당되는 bean을 찾지 못하면 무조건 오류 발생.
@Autowired(required=false) : null값 허용
TestService ts; // servlet-context에 등록되어 있으므로 second-servlet에서는 bean을 불러올 수 없다.

@Inject
@Named("td") //TestDAO 두개 있으니까 이름 지정해서 불러옴 
TestDAO dao;

 

@GetMapping("main")
public void doMain() {
System.out.println("second controller do main 호출");
if(dao != null) {
dao.select("Second Controller");
}else {
System.out.println("Second Controller dao is null");
}

if(ts != null) {
ts.testService("secondController ");
}else {
System.out.println("Second Controller ts is null");
}
}
}


실제로 의존성 주입시에 @RequiredArgsConstructor 를 많이 이용한다. 

가장 안전하게 bean을 주입받아서 사용하는 방법.

(싱글톤이라서 한 번 생성되면 그 인스턴스가 계속 쓰임. 주입된 정보가 서버 종료 전까지 유지).

**********setter로 값이 변경이 되지 않도록 필드final로 설정한다. 

 

 

@Controller("main")
@RequiredArgsConstructor
public class MainController {
/* 
값이 변경되지 않도록 필드를 final로 설정. 여기서 의존성 주입 받으려면
Autowired: 기본생성자로 먼저 생성후 필드에 값 넣음. final 필드는 의존성 주입 불가
 따라서 생성자 추가. Bean 등록하려고 자동으로 ts bean, td bean 찾아서 객체 생성한다. 
 가장 안전하게 bean을 주입받아서 사용하는 방법.(주입된 정보가 서버 종료 전까지 유지.)
*/
// -> 생성자 만들 필요 없이 @RequiredArgsConstructor 추가하면 가장 편함!
private final TestService ts;
private final TestDAO td;

// public MainController() {}
// 만약 생성자가 여러개 있는 경우에는 주입받아야할 생성자에 Autowired 추가해야함. 
// @Autowired
/*
public MainController(TestService ts, TestDAO td) {
super();
this.ts = ts;
this.td = td;
}
*/

@GetMapping("main")
public String main() {
System.out.println(ts);
System.out.println(td);
return "home";
}

}

 

 


/* javax.annotation.PostConstruct
 * @PostConstruct :
 * 객체가 생성이 되고
 * 의존성 주입이 완료되고 나면
 * bean으로 등록되기 전에 
 * 초기화 작업 할 수 있도록 
 * 최초에 한 번 호출되는 method
 */
@PostConstruct
public void init() {

System.out.println(ts);
System.out.println(path);
System.out.println(dao);
}

'Java > Spring' 카테고리의 다른 글

MyBatis 설정(ORM)  (0) 2023.07.27
Spring에 DB 연동 셋업  (0) 2023.07.27
SPRING 관련 용어들  (0) 2023.07.25
7.24 Spring Framework (Spring MVC)구조  (0) 2023.07.24
Spring set up  (0) 2023.07.24