(의존성에 의존성으로 스프링콘텍스트가 여기에 이미 포함되어 있다)


servlet-api
servlet.jsp-api
jstl-api
jstl-impl (구현체)
tomcat jdbc(커넥션풀)
spring-jdbc
spring-data jdbc
참고) 이거보다는 jpa를 더 많이 사용한다함
mybatis
mybatis-spring
ojdbc11
lombok
compileOnly 'org.projectlombok:lombok:1.18.34'
getter/setter 메서드, 생성자, toString 메서드 등 반복적인 코드 작성을 자동화
@Data : @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 한 번에 적용
@Builder : 빌더 패턴을 사용하여 객체를 생성
import lombok.Builder;
@Builder
public class User {
private String username;
private String email;
private int age;
}
// 사용 예시
User user = User.builder()
.username("john_doe")
.email("john.doe@example.com")
.age(25)
.build();
@NoArgsConstructor // 기본 생성자
@RequiredArgsConstructor // final 필드와 @NonNull 필드를 위한 생성자
@AllArgsConstructor // 모든 필드를 위한 생성자
slf4j-api(로거)
logback classic(로거 구현체)
spring-test





(우리가 현재 사용하고 있는 서블릿 6버전은 안해도 ㄱㅊㄱㅊ 벗 옛날버전꺼도 알아야 하니 try try)


ㄴ 웹mvc설정관련된 메서드



ㄴ @Controller : 모든 요청이 오면 여기서 찾아서 실행

ㄴ 휴 연동됨ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

<root level="INFO"> : 디버그로 되어있는거 변경, 디버그는 너무 길게 나옴<logger name="org.springframework.jdbc" level="TRACE" /><logger name="org.choongang.member.mappers" level="DEBUG" />
package org.choongang.config;
@Configuration
@EnableTransactionManagement // 트랜잭션관련된 설정 자동화
@MapperScan("org.choongang") // 정의하는데로 다 추가
@EnableJdbcRepositories("org.choongang") // 빈으로 만듬 + 구현체도 알아서 생성
public class DBConfig extends AbstractJdbcConfiguration {
@Bean(destroyMethod = "close") // 자원 해제
public DataSource dataSource() {
DataSource ds = new DataSource();
/* DB 연결 설정 S */
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
//ds.setUsername("SPRING");
ds.setUsername(System.getenv("db.username"));
//getenv: 환경변수 조회
//ds.setPassword("oracle");
ds.setPassword(System.getenv("db.password"));
/* DB 연결 설정 E */
/* 커넥션 풀 설정 S */
ds.setTestWhileIdle(true); // 유휴 객체 유효성 체크
ds.setInitialSize(2);
ds.setMaxActive(10);
ds.setTimeBetweenEvictionRunsMillis(10 * 1000); // 10초에 한번씩 연결 상태 체크(기본값 5초)
ds.setMinEvictableIdleTimeMillis(1000 * 60); // 유휴 객체(아무것도 하지 않고 있는 객체) 생존 시간 1분(기본값 1분, 안해도 되는데 걍 씀)
/* 커넥션 풀 설정 E */
return ds;
}
@Bean // 외부꺼라서 수동빈 등록해주어야함
public JdbcTemplate jdbcTemplate() { // 마이바티스 슬꺼면 안해도 되긴 함
return new JdbcTemplate(dataSource());
}
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource());
return tm;
}
@Bean // 마이바티스 설정
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
return sqlSessionFactory;
}
@Bean
public NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
}

ㄴ db연결 + 커넥션풀 설정 = DataSource

ㄴ JdbcTemplate(마이바티스 할거면 이거 안해도 됨) : 스프링 컨테이너 안에 관릴객체로 넣어주기
ㄴ PlatformTransactionManager (이거 뭐징)
ㄴ SqlSessionFactory(마이바티스 설정)

ㄴ 설정 추가
예시) 어제꺼 복붙




ㄴ 이거 뭐냥

ㄴ 응답코드 관련된 이넘상수

ㄴ 이거 가지고 응답코드 가져올 수 있음

ㄴ 응답코드 체크 가능한 메서드?

ㄴ 응답코드 설정

ㄴ 응답코드 400으로 고정
@Bean
public NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}https://docs.spring.io/spring-data/commons/docs/current/api/index.html





ㄴ 애 뭐하는 역할이더라

ㄴ @NoArgsConstructor @AllArgsConstructor 추가(왜?)
ㄴ @id : 기본키를 명시해야 함
ㄴ 래퍼 클래스 Long으로 바꿔줌 왜?

ㄴ 이게 지네릭 클래스라서(지네릭에는 기본형자료형못들어감)

ㄴ 매개변수 : 엔티티 자료형, 기본키 자료형


ㄴ 쿼리 안썻는데 자바코드로 셀렉트 해줌





ㄴ 조회
ㄴ 옵셔널이 왜있지?
ㄴ 없는 값을 조회할 때 용이라는데 모르것,,,
ㄴ 파인드바이 아이디 반환값 : 옵셔널 형태

ㄴ 조회됨
ㄴ 애는 _사용시 자동으로 카멜케이스로 바꿔줌
= resultMap 따로 필요 없다ㅏㅏ




ㄴ 조회할 때 where절이 없어...

ㄴ 기본키가 아닌 이메일 이용해서 crud
ㄴ 쿼리메서드
ㄴ find(select)
ㄴ by (조건, where)
ㄴ find + (엔티티 이름) + By + 변수이름

ㄴ 쿼리메서드통해 where절 극복




ㄴ 넘 길어...가독성 떨어져서 이렇게는 잘 사용안함
ㄴ 그래서 간단한 쿼리만 쿼리메서드 사용함

ㄴ 나중에는 이것도 안쓴다...(직접 쿼리 작성하는거는 위험하기 때문 현재는 지원해주는 기능 없음...하)
ㄴ 스프링jpa에선 알아서 쿼리를 써준다...

Interface Pageable
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html
Class PageRequest
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/PageRequest.html

ㄴ 생성자가 protected
ㄴ of() : 거의다 객체를 만드는 것

ㄴ 1,2번 메서드를 가장 많이 사용
ㄴ 매개변수 : ???, 한 페이지당 보여줄 갯수, sort(정렬 = order by)
ㄴ of : 거의다 객체를 만드는 것
ㄴ 페이지 번호는 0부터 시작



ㄴ 표준쿼리(11버전은 오류날거라고...)

ㄴ 한페이지당 3개씩 조회

Interface Page<T>
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Page.html




ㄴ 쿼리가 2번 실행 됨




ㄴ 오더 : 솔트의 정적내부 메서드
ㄴ 너무길다


ㄴ import해서 코드 줄이기

ㄴ 2차 정렬 추가함

ㄴ order by 쿼리가 추가된 모습

ㄴ DB테이블명 이렇게 알려주기


참고) 커맨드 객체 : 요청 쪽 데이터를 자동 매핑
참고) request.setAttribute = model.addAttribute


ㄴ 속성 : 이름과 값 형태
ㄴ 범위는 리퀘스트와 똑같음
ㄴ 기존방식은 request.setAttribute로 함
ㄴ request.setAttribute = model.addAttribute




1)
**
/board/**-> /board 경로의 모든 파일과 하위 경로를 포함한 모든 파일
- /board/list.jsp ⭕
- /borad/sub/list.jsp ⭕
2)
*
/board/*-> /board 경로의 모든 파일
- /board/list.jsp ⭕
- /board/sub/list.jsp ❌
3)
?
/m?01-> 바뀔 수 있는 부분 정의 할 때 사용
- /ma01 ⭕
- /mb01 ⭕
- /m101 ⭕

ㄴ 정적경로 여기다 정의할거임
ㄴ css, 자바스크립트 이런데서 찾아야 함...?
ㄴ 정적인거는 주로 여기에 정의함

ㄴ addResourceHandlers : 메서드 오버라이딩






: 요청과 응답의 창구 역할을 하는 서블릿 클래스
: 요청 방식 + 주소 -> 스프링 컨테이너에 있는 컨트롤러 빈을 검색
: 형태가 다양한 컨트롤러 빈(@Controller, Controller 인터페이스, HttpRequestHandler 인터페이스) -> 실행 -> ModelAndView로 반환
참고) ModelAndView
- addAttribute(String name, String value) : EL 속성으로 추가되는 속성
- setViewName(...) : 뷰 경로
: ModelAndView 정보 -> 출력을 위한 View 객체 검색
HttpServletRequest
String getParameter(String name)
String[] getParameterValues(String name);