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 |