삼성SDS

삼성SDS

개발팀 리뷰

위 내용은 삼성SDS 전 • 현 재직자의 응답 결과입니다.

기술 스택

언어

Java

javascript

프론트엔드

VueJS

React

백엔드

SpringBoot

MyBatis

Spring

git

데이터베이스

PostgreSQL

MariaDB

MySQL

데브옵스

Github

Jenkins

Helm

재직자가 작성한 글

profile picture

김병호

삼성 SDS 프로젝트 관리

안티프래질(Anti fragile)한 상품개발 프로젝트 관리

2008년 금융위기를 예측한 《블랙스완》(2007)의 저자인 나심 탈 레브(Nassim Nicholas Taleb)는 불확실성에 대한 연작물을 저술하였는데 대표작으로는 《안티프래질》(2013)이 있습니다. 상품개발 프로젝트 위험관리 영역에서 참조할 수 있는 《안티프래질》(2013)의 내용에 저의 의견을 보태어 공유합니다. 안티프래질은 사전에 없는 단어입니다. 프래질(fragile)은 유리와 같이 ‘충격에 약 한’것을 의미합니다. 안티프래질은 프래질의 반대말로 ‘충격을 받을수록 강해지는’ 이라는 의미입니다(‘충격에 강한’이 아닙니다). 일반적으로 물체는 충격을 받으면 모양이 깨지거나 파괴됩니다. 그러나 생태계 나 유기체의 속성을 가지고 있는 것은 충격을 받을수록 강해질 수 있습니다. 인류 가 진화를 해온 것이나 문명을 이룩한 것은 모두 위협(충격)에 대응하여 더 강해진 결과라고 할 수 있습니다. 우리 주변에서 안티프래질 개념을 적용할 수 있는 것은 많습니다. 단식, 웨이트 운동은 신체에 충격을 주어 몸을 건강하게 만드는 안티프래질의 대표적인 예입니다. 출시 후 상품의 큰 개선은 상품을 프래질하게 만들지만, 출시 전 상품의 개선은 상품을 안티프래질하게 만듭니다. 상품기획 단계에서 고객에게 충격을 많이 받을수록 상품은 안티프래질해집니다. - 미래를 예측하지 못해도, 충격에 프래질해서는 안됩니다. 프로젝트 결과를 예측하는 것은 힘듭니다. 그러나 프로젝트 결과에 따라 기업이 큰 타격을 입어서는 안됩니다. 포트폴리오 관리를 할 여유가 없는 스타트업은 예외입니다. 개인의 자산관리도 마찬가지입니다. 실패를 예측하는 노력보다 실 패의 크기를 제한하는 것이 중요합니다. - 작은 산불은 큰 산불을 예방합니다. (작은 실패를 용인하고 장려합니다) 작은 산불은 큰 산불을 예방합니다. 작은 산불이 낙엽이나 나뭇가지처럼 인화성 물질을 없애기 때문입니다. 실제로 호주 원주민들은 덤불에 작은 불을 붙여 태우는 방식으로, 큰 화재가 발생했을 때 불이 번지는 것을 막습니다. 상품개발도 마찬가지입니다. 상품개발의 작은 실패에서 배운 교훈을 적용하면 큰 실패를 예방할 수 있습니다. 작은 실패도 허용하지 않기 위해 프로세스와 관리체계를 복잡하게 운영하면 작은 실패에는 강하지만, 큰 실패에는 취약합니다. 정부의 복잡한 규제가 초래하는 부작용이 대표적인 예입니다. - 지나치게 많은 정보는 해롭습니다. 데이터를 자주 볼수록 유의미한 신호보다 의미 없는 잡음을 많이 접합니다. 금융 거래는 하루를 기준으로 볼 때 5%의 신호를 제외한 95%가 잡음입니다. 매일, 자주 듣는 건강정보도 자주 섭취하는 설탕과 같이 정신건강에 좋지 않습니다. 건강정보에 집중할수록 잡음에 근거한 의사결정 확률이 높기 때문입니다. 고객이 상품을 구매하는 이유는 복잡하지 않습니다. 찾아내기가 어려울 뿐입니다. 인터넷 정보를 분석하는 시간을 줄이고 상품의 본질을 고민하는 시간을 늘리는 것이 성공으로 가는 지름길입니다. - 양극단을 추구하는 바벨(역기) 전략이 때로는 유용합니다. 개인의 자산관리에 비유하면 90%의 재산은 안전한 상품으로 보유하고, 10% 재산은 위험이 매우 높은 상품에 투자하는 것입니다. 중간 정도의 위험에 모든 자산을 투자하면 큰 위기에 매우 취약해집니다. 이는 상품 포트폴리오 운영에서도 마찬가지입니다. 위험이 매우 높은 상품의 포트폴리오를 일정비율 유지하는 것이 바람직합니다. 안정적인 직업이 있는 개인이 퇴근 후 본인이 정말 좋아하는 일(창작, 유튜버)을 하면 큰 실패를 할 확률이 없으면서도 큰 성공을 할 수도 있습니다. - ‘증거의 부재’가 ‘부재의 증거’는 아닙니다. 건강검진을 통해 암을 발견하지 못했다고 암이 없다는 증거는 아닙니다. 마찬가지로 상품이 성공한다는 증거가 없다고 해서 실패한다는 것을 의미하지는 않으며 반대의 경우도 마찬가지입니다. 경영진이 요청하는 성공의 근거를 제시하지 못한다고 그 상품이 실패하는 것은 아닙니다. 특정 주장이 옳다는 것을 입증 하기는 무척 힘들지만 특정 주장이 틀렸다는 것은 반대 사례 하나만 있으면 충분합니다. 세상의 백조가 모두 흰색이라는 것(긍정적 지식)은 입증하기 힘들지만, 세상의 백조가 모두 흰색은 아니라는 것(부정적 지식)은 다른 색깔의 백조 한 마리면 충분합니다. - 어설픈 개입은 해롭습니다. 무언가를 하는 것이 하지 않는 것보다 쉽습니다. 환자에게 아무것도 하지 않는 의사는 무능력해 보일 수 있습니다. 그러나 환자를 생각하는 명의가 섣부른 치료를 하지 않는 이유는 우리 몸에는 자가치유력이 있어 어설픈 개입이 해가 될 수 있기 때문입니다. 상품 개발도 경영층이나 관리부서가 지나치게 개입하고 통제하면 부작용이 많아집니다. 경영층이 개입하지 않은 상태에서 상품개발 팀원들이 협업하고 소통하며 문 제를 해결하는 것이 단기적으로는 느리게 보여도 장기적으로는 조직을 안티프래질하게 만듭니다. - 승부의 책임(skin in the game)을 장려합니다. 의사결정에 대한 책임을 져야 합니다. 로마시대에 다리를 만든 사람은 일정기간 동안 다리 아래에 집을 짓고 살았다고 합니다. 상품개발과 관련된 이해관계자를 닭과 돼지로 은유하기도 합니다. 아침 식사를 만들 때 닭은 자신이 희생되지 않는 대신 계란을 내어주고 돼지는 자신의 살을 도려내어 베이컨을 줍니다. 프로젝트 결과를 책임지는 상품개발팀은 돼지로, 관리팀은 닭에 비유하는 경우가 많습니다. ‘돼지’들이 열심히 창의적으로 일할 수 있는 프로젝트 환경을 제공하 고 ‘닭’들이 의사결정에 미치는 영향이 적도록 해야 합니다. 상품개발 팀을 프래질하게 만들수록 안티프래질해지는 부서는 기업 내부에 없어야 합니다. 아래는 제가 《안티프래질》(2013)에서 좋아하는 문구입니다. 바람은 촛불은 꺼뜨리지만 모닥불은 살린다. 무작위성, 불확실성, 카오스도 마찬가지 다. 나는 당신이 이런 것들을 피하지 않고 활용하기를 원한다. 불이 되어 바람을 맞이 하라.

profile picture

김병호

삼성 SDS 프로젝트 관리

사후 짜맞추기 식의 상품 성공요인 분석에 유의해야 합니다.

코닥이나 노키아가 몰락한 뒤 실패 원인을 말하는 사후 분석가는 많지만 코닥이나 노키아의 전성기에 기업의 몰락을 예견하고 경고했던 학자는 찾기 어렵습니다. 그리고 성공은 포장해서 발표하지만, 실패는 이야기하지 않습니다. 비슷한 과정을 거쳤는데 어떤 상품은 성공하고, 어떤 상품은 실패합니다. 애자일 방법론 적용에 대한 성공과 실패요인 분석도 마찬가지 입니다. 대부분의 상품은 영화와 같이 출시 전에 고객의 반응을 예측하기 힘듭니다. 파묘의 감독이 1,000만 관객을 예상했을까요? 장재현 감독은 비슷한 장르의 영화를 계속 만들어왔는데 파묘에서 영화제작 과정이나 스타일의 변화가 있었을까요? 제가 영화분야 전문가가 아니라 잘못 알고 있을 수도 있지만 영화의 성공도 사전에 예측하기 힘든 운의 영역이 많을 것입니다. 신상품의 성공 및 실패 원인 분석을 신중하게 해야 하는 이유를 잘 설명하고 있는 문구들을 소개합니다. 잘 팔리는 소설이 잘 쓰여진 소설은 맞지만, 잘 쓰여진 소설이 잘 팔리는 소설은 아니다. (《행운에 속지마라》, 2010) 똑같이 하고도 실패한 상품은 사라지기에 성공 요인으로 포장될 수 있다. 성공 요인에 대한 사후 합리화와 함께. (《행운에 속지마라》, 2010) 성공의 이유는 상황이 벌어진 뒤에야 비로소 이해할 수 있다. 기억상실증 증세가 있는 테크 언론계는 기업이 어떻게 그런 성공에 이르게 되었는가에 관한 화려한 가짜 스토리를 지어낸다. 이렇게 되면 반쯤 장님인 이가 저지른 성공 확률이 희박한 ‘도박’이 확신 가득한 선지자가 실천한 ‘혁신’으로 탈바꿈한다. (《카오스멍키》, 2017 상품개발의 성공확률을 높이기 위해서는 상품기획과 개발과정의 실력과 역량이 중요합니다. 타구의 질이 좋아도 수비수에게 잡힐 수는 있어도 시즌이 끝날때 쯤이면 타자의 실력에 맞는 타율에 수렴하는 것처럼....

재직자가 좋아한 글

Spring 면접 전 살펴보기 위한 Q&A 35가지 (2024년 ver)  |   1. 스프링 프레임워크란 무엇인가요? * 자바 엔터프라이즈 애플리케이션 개발을 위한 가장 널리 사용되는 프레임워크입니다. * 경량화, 제어 역전(IOC), 관점 지향 프로그래밍(AOP), 트랜잭션 관리 등의 기능을 제공합니다. 2. 스프링을 사용하면 어떤 장점이 있나요? * 경량화로 프레임워크로 인한 개발 오버헤드가 적습니다. * IoC 컨테이너가 객체 간 의존성 주입을 관리해줍니다. * AOP로 핵심 로직과 시스템 서비스를 분리할 수 있습니다. 3. 대표적인 스프링 하위 프로젝트들은 무엇인가요? * 스프링 코어: IoC/DI 등 프레임워크 핵심 기능 제공 * 스프링 JDBC: JDBC 코딩 없이 DB 연동 기능 * 스프링 ORM: JPA, Hibernate 등의 ORM 연동 계층 * 스프링 웹: 파일 업로드, 서블릿 리스너 등 웹 관련 기능 * 스프링 MVC: MVC 아키텍처 웹 개발 모듈 * 스프링 AOP: AOP 구현 및 메소드 인터셉터 정의 4. 의존성 주입(DI)이란 무엇인가요? * 객체를 직접 생성하지 않고, 생성 방법을 기술하면 IoC 컨테이너가 필요할 때 인스턴스화해서 주입하는 개념입니다. 5. 스프링에서 빈을 주입하는 방식에는 어떤 것들이 있나요? * Setter 주입 * 생성자 주입 * 필드 주입 * XML 또는 애노테이션으로 설정 가능 6. 빈 주입 방식 중 권장되는 방식은 무엇이고 그 이유는 무엇인가요? * 필수 의존성은 생성자 주입, 선택적 의존성은 Setter 주입을 권장합니다. * 생성자 주입을 사용하면 immutable 필드에 값 주입이 가능하고 테스트가 용이해집니다. 7. BeanFactory와 ApplicationContext의 차이점은 무엇인가요? * BeanFactory는 빈 인스턴스를 제공하고 관리하는 컨테이너 인터페이스입니다. getBean()이 호출될 때 lazy하게 빈을 생성합니다. * ApplicationContext는 BeanFactory를 상속하면서 애플리케이션의 모든 정보, 메타데이터, 빈을 담고 있는 컨테이너 인터페이스입니다. 기본적으로 애플리케이션 구동 시점에 eager하게 빈을 생성합니다. 8. 스프링 빈이란 무엇인가요? * 스프링 IoC 컨테이너에 의해 인스턴스화, 관리되는 자바 오브젝트를 말합니다. 9. 스프링 프레임워크에서 빈의 기본 스코프는 무엇인가요? * 별도 설정이 없다면 스프링 빈은 singleton 스코프로 생성됩니다. 10. 빈의 스코프는 어떻게 지정할 수 있나요? * @Scope 애노테이션이나 XML 설정 파일에서 "scope" 속성을 사용해 지정할 수 있습니다. * 스프링에서 지원하는 빈 스코프에는 다음과 같은 것들이 있습니다. * singleton * prototype * request * session * global-session 11. 싱글톤 빈은 스레드에 안전한가요? * 아니오. 싱글톤 빈 자체는 스레드 세이프하지 않습니다. * 스레드 안전성은 빈의 실행 방식에 달려 있고, 싱글톤은 생성 방식에 초점을 둔 디자인 패턴입니다. * 빈의 구현 코드에 따라 스레드 안전성이 결정됩니다. 12. 스프링 빈의 생명주기는 어떻게 되나요? * 빈 정의를 읽고 인스턴스화 → 의존성 주입 → 초기화 콜백 메소드 호출 → 사용 → 소멸 콜백 메소드 호출 → 빈 소멸 * 각 단계별로 초기화 메소드, 소멸 메소드 등을 빈에 적절히 설정해서 사용할 수 있습니다. 13. 스프링 자바 기반 설정이란 무엇인가요? * XML 기반 설정의 대안으로, 자바 클래스와 애노테이션을 사용해 설정하는 방식입니다. * 타입 세이프한 방식으로 스프링 애플리케이션 구성이 가능합니다. 14. 하나의 프로젝트에 여러 개의 스프링 설정 파일을 사용할 수 있나요? * 네, 가능합니다. 큰 프로젝트에서는 모듈화와 유지보수성을 위해 여러 개의 설정 파일 사용이 권장됩니다. * 자바 기반 설정에서는 @Configuration과 @Import 애노테이션을 사용해 여러 설정 클래스를 조합할 수 있습니다. * XML 기반 설정에서는 <import> 태그를 사용해 여러 XML 파일을 조합할 수 있습니다. 15. 스프링 시큐리티란 무엇인가요? * 스프링 기반 애플리케이션의 인증과 권한 부여 등 보안 기능을 담당하는 프레임워크입니다. * 스프링 시큐리티를 사용하면 인증/인가 관련 표준 로직을 작성하지 않아도 되고, CSRF 공격 등을 방어할 수 있습니다. * 웹 애플리케이션에 @EnableWebSecurity 애노테이션만 붙여주면 기본적인 웹 보안 기능이 작동합니다. 16. 스프링 부트란 무엇인가요? * 스프링 기반 애플리케이션을 빠르게 개발할 수 있게 도와주는 프로젝트입니다. * 단독 실행 가능한 스프링 애플리케이션을 쉽게 생성할 수 있습니다. * 내장 서버, 자동 설정, starter 의존성 등으로 최소한의 설정으로 개발을 시작할 수 있습니다. 17. 스프링 프레임워크에서 사용되는 디자인 패턴에는 어떤 것들이 있나요? * 싱글톤 패턴: 싱글톤 스코프의 빈 * 팩토리 패턴: BeanFactory 클래스 * 프로토타입 패턴: 프로토타입 스코프의 빈 * 프록시 패턴: 스프링 AOP * 템플릿 메소드 패턴: JdbcTemplate, HibernateTemplate 등 * 프론트 컨트롤러 패턴: 스프링 MVC의 DispatcherServlet * 데이터 접근 오브젝트(DAO) 패턴: 스프링 DAO 지원 18. 프로토타입 스코프는 어떻게 동작하나요? * 프로토타입 스코프로 정의된 빈은 매번 getBean() 메소드가 호출될 때마다 새로운 오브젝트를 생성해서 반환합니다. * 이는 기본인 싱글톤 스코프와 대조적입니다. 싱글톤은 IoC 컨테이너당 하나의 오브젝트만 생성합니다. 19. 스프링 빈에서 ServletContext와 ServletConfig 객체는 어떻게 얻나요? * 스프링에서 제공하는 Aware 인터페이스들을 구현하는 방법이 있습니다. * @Autowired 애노테이션을 사용해서 주입받는 방법도 가능합니다. 20. 스프링 MVC의 컨트롤러란 무엇인가요? * 스프링 MVC에서 사용자의 요청을 처리하는 컴포넌트입니다. * @Controller 애노테이션이 붙은 클래스가 컨트롤러의 역할을 합니다. * 컨트롤러 클래스의 메소드는 @RequestMapping 애노테이션으로 매핑된 특정 URI를 처리합니다. 21. @RequestMapping 애노테이션은 어떻게 사용하나요? * 요청 URL을 컨트롤러의 메소드와 매핑할 때 사용하는 애노테이션입니다. * URL 패턴 외에도 HTTP 메소드 타입, 헤더, 파라미터 등을 매핑 조건으로 지정 가능합니다. * @PathVariable을 통해 URL 템플릿 변수를 메소드 파라미터로 받을 수 있습니다. * @RequestParam을 통해 HTTP 요청 파라미터를 메소드 파라미터로 받을 수 있습니다. 22. 스프링 JDBC의 JdbcTemplate 클래스는 무엇이고 어떻게 사용하나요? * 스프링에서 JDBC 프로그래밍을 쉽게 할 수 있도록 제공하는 템플릿 클래스입니다. * 리소스 생성, 해지 등의 low-level 작업을 대신 처리해줍니다. * SQLException을 스프링 DataAccessException으로 변환하는 기능도 제공합니다. * JdbcTemplate을 사용하려면 DataSource를 스프링 설정 파일에 등록해야 합니다. 23. 스프링에서 트랜잭션은 어떻게 사용하고, 어떤 이점이 있나요? * 선언적 트랜잭션(@Transactional)과 프로그래밍적 트랜잭션(TransactionTemplate) 두 가지 방식을 제공합니다. * 선언적 트랜잭션은 코드 침투가 없고 AOP를 사용하기 때문에 권장됩니다. * 트랜잭션 전파, 격리 수준, 읽기 전용 등을 애노테이션 속성으로 제어할 수 있습니다. * 트랜잭션 경계를 메소드 단위로 설정할 수 있어서 productivity가 높아집니다. * 다양한 데이터 접근 기술에 대해 일관된 트랜잭션 제어가 가능합니다. 24. 스프링 DAO란 무엇인가요? * Data Access Object의 약자로, 데이터 접근을 추상화한 객체입니다. * 스프링은 일관성 있는 DAO를 작성할 수 있도록 다양한 기능을 제공합니다. * 저수준 예외를 스프링의 통일된 예외 체계로 변환해줍니다. * 템플릿 클래스를 통해 boilerplate 코드를 제거할 수 있습니다. 25. AOP(Aspect-Oriented Programming)란 무엇인가요? * 관점 지향 프로그래밍이라고 하며, 스프링의 핵심 기능 중 하나입니다. * 여러 객체에 공통으로 적용될 수 있는 기능(cross-cutting concern)을 분리해서 모듈화합니다. * 주로 로깅, 트랜잭션, 보안 등 인프라 레벨의 공통 기능을 구현하는데 사용합니다. * AOP를 통해 객체 간 결합도를 낮추고, 코드 재사용성을 높일 수 있습니다. 26. AOP에서 Aspect, Advice, Pointcut, JoinPoint란 무엇인가요? * Aspect: 여러 객체에 공통으로 적용되는 공통 관심사(cross-cutting concern)를 모듈화 한 것입니다. 트랜잭션 관리 등이 대표적입니다. * Advice: 특정 JoinPoint에서 Aspect에 의해 취해지는 조치입니다. Around, Before, After 등의 타입이 있습니다. * Pointcut: Advice가 적용될 JoinPoint를 선별하는 조건입니다. 주로 정규 표현식으로 표현합니다. * JoinPoint: Advice가 적용될 수 있는 위치입니다. 메소드 호출, 예외 발생 등이 있습니다. 27. AOP의 Weaving이란 무엇인가요? * Aspect를 타깃 객체에 적용해서 새로운 프록시 객체를 생성하는 과정을 말합니다. * 즉, Advice를 핵심 로직 코드에 삽입하는 과정입니다. * 컴파일타임, 로딩타임, 런타임에 적용할 수 있는데, 스프링 AOP는 런타임 위빙을 사용합니다. 28. 리액티브 프로그래밍이란 무엇인가요? * 데이터 흐름과 변경 전파에 중점을 둔 프로그래밍 패러다임입니다. * 주요 특징으로는 논블로킹(non-blocking), 이벤트 기반(event-driven), 느슨한 결합(loosely coupled), 확장성(scalable) 등이 있습니다. * Observer 패턴을 확장해서, 데이터 스트림을 비동기적으로 처리합니다. * 스프링에서는 5.0 버전부터 WebFlux를 통해 리액티브 프로그래밍을 지원하고 있습니다. 29. 스프링 WebFlux란 무엇인가요? * 스프링 5.0에서 추가된 리액티브 웹 프레임워크입니다. * 기존의 스프링 MVC와는 별개의 모듈로서 완전한 논블로킹 방식으로 동작합니다. * 네티(Netty)를 기반으로 동작하며, 서블릿 컨테이너에서도 동작 가능합니다. * 함수형 프로그래밍 방식을 지원하며, Mono와 Flux 타입을 사용해 리액티브 데이터 타입을 표현합니다. 30. Mono와 Flux란 무엇인가요? * 스프링 5의 리액티브 프로그래밍에서 사용되는 핵심 객체 타입입니다. * Mono는 0-1개의 데이터를 발행하는 Reactive Stream 구현체입니다. * Flux는 0-N개의 데이터를 발행하는 Reactive Stream 구현체입니다. * 모두 Reactive Stream 표준 인터페이스인 Publisher를 구현하고 있습니다. 31. WebClient와 WebTestClient는 각각 어떤 용도인가요? * WebClient는 스프링 WebFlux에서 제공하는 논블로킹 방식의 리액티브 HTTP 클라이언트입니다. * HTTP 요청을 비동기적으로 처리하며, Mono나 Flux를 사용해 응답을 받을 수 있습니다. * WebTestClient는 WebFlux 애플리케이션을 테스트할 때 사용하는 클라이언트입니다. * 실제 서버를 띄우지 않고도 mock request/response를 사용해 컨트롤러 테스트를 할 수 있습니다. 32. 리액티브 스트림 사용 시 주의할 점은 무엇인가요? * 리액티브 프로그래밍은 기존 방식과 사고의 전환이 필요해 진입장벽이 높습니다. * 리액티브 스트림을 디버깅하기 쉽지 않기 때문에 디버깅 방식에 대한 학습이 필요합니다. * 전통적인 JDBC 기반 DB 드라이버는 리액티브 방식을 지원하지 않아 사용에 주의가 필요합니다. 33. 스프링 5에서 리액티브 프로그래밍을 지원하기 위해 최소 자바 버전이 올라갔나요? * 네, 맞습니다. 스프링 5는 자바 8 이상에서만 동작합니다. * 자바 8의 람다, Stream API, CompletableFuture 등을 활용하기 위해 최소 사양을 올린 것으로 보입니다. 34. 스프링 5는 자바 9의 모듈 시스템(Jigsaw)을 어떻게 지원하나요? * 스프링 5의 프레임워크 라이브러리들은 자바 9 모듈 시스템을 따르도록 변경되었습니다. * 그래서 필요한 모듈만 선택적으로 가져올 수 있게 되었습니다. * 하지만 스프링 부트 2.0에서는 아직 자바 9 모듈을 완벽하게 지원하지 않습니다. 35. 스프링 MVC와 WebFlux를 함께 사용할 수 있나요? * 스프링 부트에서는 현재 둘 중 하나만 선택해서 사용하는 것을 권장합니다. * 왜냐하면 둘 다 사용하면 자동 설정이 제대로 동작하지 않기 때문입니다. * 또한 스프링 MVC는 서블릿 기반인 반면 WebFlux는 네티 기반이라 함께 사용하기에 적절치 않습니다. 출처 : https://www.baeldung.com/spring-interview-questions

좋아요 468 저장 1164

thumbnail