Logger log = LoggerFactory.getLogger(getClass());
을 불러오거나@Slf4j
로 대체@Controller
@Slf4j
public class HomeController {
// Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/")
public String home() {
log.info("home controller");
return "home"; //home.html로 찾아간다.
}
}
쉽게 현재 위치 파악 가능
MemberForm.java
@Getter @Setter
public class MemberForm {
private String name;
private String city;
private String street;
private String zipcode;
}
controller에 객체 그대로 넘길 수 있음
@GetMapping("/members/new")
public String createForm(Model model) {
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
타임리프에서 th:object, th:field 사용
<form role="form" action="/members/new" th:object="${memberForm}" method="post">
<div class="form-group">
<label th:for="name">이름</label>
<input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요" />
EntityManagerFactory
주입@PersistenceUnit
를 사용하면 되긴하나 굳이 사용 ❌EntityManager
불러오기@PersistenceContext
도 굳이 사용 ❌@Autowired
가 대신 처리private final EntityManager em;
@RequiredArgsConstructor
가 생성자 처리 가능👍 결론
@Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; }
@Transactional
추가import 시 스프링에서 제공하는 것으로 사용
org.springframework.transaction.annotation.Transactional
@Transactional(readOnly=true)
@Transactional
을 써두면 됨클래스 레벨에서 transactional주는 것과 메서드에서 transaction 하는 것의 차이?
- 그냥 select에 걸어주는 습관 같은 것, insert에만 transactioanl 따로 해주는 것이 관례
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
<td th:text="${member.address?.city}"></td>
<td th:text="${member.address?.street}"></td>
<td th:text="${member.address?.zipcode}"></td>
</tr>