-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[5주차] (오형석, 김수환, 권용현) #1
Comments
[1장 오브젝트와 의존관계]객체지향설계 DAO의 분리객체지향 설계는 미래의 변화에 대비할 수 있어야 한다.
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
...
}
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
...
}
private Connection getConnectionO throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mysql://localhost/springbook", "spring", "book");
}
: 변경사항에 대한 검증
테스트를 통해 기능이 유지되는지 검증할 수 있다.
public abstract class UserDao {
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
}
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
}
public abstract Connection getConnection() throws ClassNotFoundException, SQLException;
public class AUserDao extends UserDao {
public Connection getConnection() throws ClassNotFoundException, SQLException {
// A 프로젝트 DB connection 생성코드
}
}
public class BUserDao extends UserDao {
public Connection getConnectionO throws ClassNotFoundException,
SQLException {
// B프로젝트 DB connection 생성코드
}
}
상속을 통해 슈퍼클래스의 기능을 확장하기 위한 디자인 패턴
서브클래스에서 구체적인 오브젝트 생성방법을 결정하게 하는것
dao의 확장오브젝트는 변한다. 변화에는 특징이 있다. 변화 마다 각기 대응 방식이 다르다
public class UserDaoTest {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
ConnectionMaker connectionMaker = new AConnectionMaker();
// A 프로젝트에서 사용하는 db연동
UserDao dao = new UserDao(connectionMaker);
// 구현 클래스 결정 -> 객체 생성
}
} 프로젝트 마다 사용하는 db가 다름 -> 같은 문제가 발생
클래스간의 관계를 설정하는 방법
객체지향 설계를 위한 여러가지 방법 개방 폐쇄 원칙
높은 응집도와 낮은 결합도
전략패턴
제어의 역전 (IoC : Inversion of Control)낮은 결합도를 활용하여 테스트, 유지관리를 더쉽게 하기 위한 설계 원칙
팩토리 : 객체 생성 방법을 결정 -> 객체를 반환
public class DaoFactory {
public UserDao userDao() {
ConnectionMaker connectionMaker = new AConnectionMakerO; UserDao userDao = new UserDao(connectionMaker);
return userDao;
}
}
public class DaoFactory {
public UserDao userDao() {
return new UserDao(connectionMaker());
}
public AccountDao accountDaoO {
return new AccountDao(connectionMaker());
}
public MessageDao messageDaoO {
return new MessageDao(connectionMaker());
}
// ConnectionMaker를 생성하는 코드
// 중복을 피하기 위해 따로 메소드를 구현
public ConnectionMaker connectionMaker(){
return new AConnectionMaker();
}
}
프로그램의 제어 흐름 구조가 뒤바뀌는 것
스프링의 IoC
싱글톤 레지스트리와 오브젝트 스코프
객체의 인스턴스를 한개만 생성되게 하는 패턴
스프링은 싱글톤 패턴으로 객체를 생성하고 관리한다.
멀티 스레드 환경에서 여러 스레드가 동시에 접근 할 수 있다.
객체가 생성되고 존재하고 적용되는 범위 싱글톤 스코프
그 외의 스코프
의존관계 주입
A ----> B : A가 B에 의존하고 있다. B의 변화가 A에 영향을 미친다. ex)
IoC를 적용하여 객체지향적인 설계, 디자인 패턴, 컨테이너에서 동작하는 서버 기술을 사용한다. 의존관계 검색과 주입
정리
스프링을 사용한다고 좋은 객체지향 설계와 깔끔하고 유연한 코드가 저절로 만들어지는건 절대 아님 |
[토비의 스프링 2장] 테스트테스트란 무엇이며, 그 가치와 장점, 활용 전략, 스프링과의 관계를 살펴본다.
테스트 코드를 작성해야 하는 이유는 뭘까?
웹에서 테스트를 하기 위해서는 모든 레이어의 기능을 다 만들고 나서야 테스트가 가능하고, 실패의 원인이 테스트 코드가 아닐 가능성도 존재한다.
단위 테스트를 이용함으로써 어느 부분에서 문제가 생기는지 상대적으로 명확하게 판단 가능 **그래도 단위 테스트를 사용 하더라도 사람이 확인을 해야되는 거잖아...? **->JUnit 프레임워크가 해결해준다
만들어진 모든 코드는 빠짐없이 테스트로 검증된다!
추가하고 싶은 기능을 구현 전에 먼저 테스트 코드로 구현한다.
테스트에서 사용될 정보나 오브젝트( 보통은 @beforeeach와 같은 메서드를 이용해서 제공한다) _⭐️스프링 컨테이너를 띄우지 않아도 되는 테스트라면 띄우지 않는 것이 가장 좋다._⭐️ public class UserDaoTest {
UserDao userDao;
@BeforeEach
public void setUp() {
ApplicationContext applicationContext = new GenericXmlApplicationContext("spring/applicationContext.xml");
this.userDao = applicationContext.getBean(UserDao.class);
...
}
...
} @ExtendWith(SpringExtension.class) // (JUnit5)
@ContextConfiguration(locations="/spring/applicationContext.xml")
public class UserDaoTest {
@Autowired ApplicationContext applicationContext;
UserDao userDao;
@BeforeEach
public void setUp() {
System.out.println("applicationContext = " + applicationContext);
System.out.println("this = " + this);
this.userDao = this.applicationContext.getBean("userDao", UserDao.class);
...
}
...
}
여기서 궁금했던것: 어노테이션 없어도 어차피 배포용 데이터베이스를 건들지 않는데 어노테이션의 쓸모?
(extra: 테스트 코드를 돌리다 보면 클래스 단위로 돌릴때 실패하던 테스트 코드가 메소드 단위로 돌리면 성공하는 경우가 있는데 이때 문제가 @DirtiesContext 안적어줘서 그럴 수도 있음)
|
The text was updated successfully, but these errors were encountered: