Junit 단위 테스트 실습을 진행했다
스프링은 아니고, 순수 자바 코드이고 쉬운 실습
public class StudentManager {
private Set<String> students = new HashSet<>();
//학생 추가
public void addStudent(String name) {
if (students.contains(name)) {
throw new IllegalArgumentException("이미 존재하는 학생입니다: " + name);
}
students.add(name);
}
//학생 제거
public void removeStudent(String name) {
if (!students.contains(name)) {
throw new IllegalArgumentException("존재하지 않는 학생입니다: " + name);
}
students.remove(name);
}
//학생 조회(boolean타입 반환)
public boolean hasStudent(String name) {
return students.contains(name);
}
}
class StudentManagerTest {
private StudentManager studentManager;
@BeforeEach
void setup() {
studentManager = new StudentManager();
studentManager.addStudent("John");
studentManager.addStudent("Scott");
studentManager.addStudent("Alice");
studentManager.addStudent("Bob");
}
@Test
@DisplayName("학생을 추가하고 Hashset에 존재하면 true를 반환한다.")
void addStudent() {
// given
String heungMin = "Son";
// when
studentManager.addStudent(heungMin);
// then
assertTrue(studentManager.hasStudent(heungMin));
}
@Test
@DisplayName("학생을 제거하고 Hashset에 학생이 존재하지 않아야 한다.")
void removeStudent() {
// given
String travis = "Scott";
// when
studentManager.removeStudent(travis);
// then
assertFalse(studentManager.hasStudent(travis));
}
@Test
@DisplayName("학생을 추가할때 이름이 중복 되면 예외 발생")
void duplicatedStudentName() {
// given
String studentName = "John";
// when
// then
assertThrows(IllegalArgumentException.class, () -> {
studentManager.addStudent(studentName);
});
}
@Test
@DisplayName("존재하지 않는 학생을 제거할때 예외 발생")
void deleteNotExist() {
// given
String studentName = "Not Exist";
// when
// then
assertThrows(IllegalArgumentException.class, () -> {
studentManager.removeStudent(studentName);
});
}
}
저번 수업에서 강조하신 것 처럼
함수 하나의 인풋과 아웃풋 테스트를 강조하셨다
Java를 예시로 들어주시며 주석을 신경쓰자고 하셨다
유지보수
- 개발 후에 이루어지는 소프트웨어 변경 작업
만든 사람에게 모든 지식, 경험이 있기 때문에 다른 사람이 와서 시스템을 고도화시키는 것은 현실적으로 매우 어렵다고 한다.
유지보수 유형
수정형은 흔히 하는것
적응형은 모바일 등 새로운 환경을 위한 유지보수
새로운 어댑터를 만들어주기 위한 유지보수라고 생각하면 된다
완전형은 접속자가 많아지면서 성능을 개선하는 유지보수
아니면 인공지능을 사용할때 모델을 교체해 주는것도 여기에 포함된다
Lehman 법칙
시스템에는 두가지 타입이 있는데
E타입 - 계속 진화하는 타입
S타입 - 완벽히 정의할 수 없는 타입 EX-체스게임
시스템은 지속적으로 변경이 일어나고 복잡도는 계속해서 증가한다는 내용이다.
헷갈리게 유형과 종류가 따로 있다
유지보수 작업 분포
문서화의 중요성에 대한 내용이다.
좀 현실적인 이야기를 해주셨는데
항상 일을 하다보면 특히 역량이 좋은 사람에게 일이 몰린다.
그러다 보면 시스템의 이해도가 그 사람이 가장 높고 조직에게 생긴 문제점은 그 사람에게 해결을 요구하거나 그 사람에게 질문을 하게 된다.
이럴때 문서화가 더 중요해 지는 것이다.
결국 시간일 걸리더라도 나는 보호하기 위해 문서화를 해야 한다고 하셨다
첨언으로 조직의 에이스가 될지 아닌 사람이 될지는 모르겠지만 에이스가 되고 싶고 에이스라면 꼭 하라고 하셨다.
(졸프를 이 교수님껄 들었어야 했다)
개인적인 경험과 연결지으니 공감 되는 내용이었다.
내가 역량이 아주 우수하다고 생각하지는 않지만 졸업 프로젝트, 부트캠프, 사이드 프로젝트, 세오스 프로젝트에서 항상 내가 담당하는 역할이 조금 많기는 했다. 개발 자체가 좋아서 이게 싫지는 않았지만 나보다 더 잘하는 사람에게 배우면서 성장하고 싶다는 생각을 많이 했었고 조금 벅찰때 이걸 어떻게 해소할지에 대해 많이 고민을 했었다.
그런데 이 수업을 듣고 생각해보니 난 문서화를 전혀 안했었던 것 같다..ㅎㅎㅎㅎ 그래서 나에게 오는 질문이 많았고 답하기 위해 카톡으로 장문의 내용을 주고 받았다. 그리고 그 답장을 하는데도 시간이 많이 걸렸었던 것 같다. 지금도 2개의 프로젝트를 진행하고 있는데 처음으로 문서화를 진행해 보고 있다. 어떤 내용을 정리했고 어떤 효과가 있었는지 나중에 하나의 글로 작성해 봐야겠다.
그리고 좋은 자소서 소스가 될 것 같기두
추가적으로 Top Down 방식으로 시스템을 이해하라고 조언해 주셨다.
컨테이너와 관련된 네트워크 지식도 조금 얘기해 주셨는데
잘 알고 있듯 docker 컨테이너는 우리의 컴퓨터와 분리된 가상 네트워크 상에 존재한다. 이걸 LNV local network virtualization이라고 한다.
그리고 가상 네트워크 스위칭 장비처럼 어떤 특정 네트워킹 기능을 하는 장비를 가상화 한 것이 NFV network function virtualization이라고 한다.
이런걸로 네트워크를 소프트웨어적으로 관리하는 것이 SDN sofware defined network이다.
'CS > Software Engineering' 카테고리의 다른 글
[소프트웨어 공학] 12. 품질 (0) | 2025.06.08 |
---|---|
[소프트웨어 공학] 10. 테스팅 추가 (0) | 2025.06.08 |
[소프트웨어 공학] 9. 코딩 (0) | 2025.06.06 |
[소프트웨어 공학] 8. UI 설계 (0) | 2025.06.06 |
[소프트웨어 공학] 7. 아키텍쳐와 패턴 (중요) (0) | 2025.06.06 |